home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 24
/
AACD 24.iso
/
AACD
/
Programming
/
2b_CreativE
/
src
/
assembler.s
< prev
next >
Wrap
Text File
|
2001-07-05
|
75KB
|
3,996 lines
;; Assembler part
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
; The ASSEMBLER part !!!!!!! ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
;; Parse
ASM_PARSE:
MOVE.L #ASM_KWORDS,D2
MOVE.L A2,D0
MOVE.L (A2),D1
AND.L #$FFFFFF00,D1
CMP.L #'PC'*$10000,D1
BEQ ASM_PC
;; Check for keywords
MOVE.L HASHVAL(PC),D7
LSL.L #2,D7
ADD.L #AKWHASH,D7
MOVE.L D7,A6
.LOOPZ:
MOVE.L (A6),A6
MOVE.L A6,D6
BEQ .SKIP_GO1
MOVE.L (A6)+,A4
MOVE.L D0,A2
.3Z:CMPM.B (A4)+,(A2)+
BNE .LOOPZ
TST.B -1(A2)
BNE .3Z
SUB.L D2,D6
LSR.L #3,D6
MOVEQ #47,D4
MOVE.W D4,(A1)+
MOVE.W D6,(A1)+
MOVEQ #-1,D0
RTS
;*-*
;; Check for commands
.SKIP_GO1:
TST.W GENERATE_PPC
BNE .2
.2BACK:
MOVE.L #ASM_INSTAB,D2
MOVE.L HASHVAL(PC),D7
LSL.L #2,D7
ADD.L #ASMHASH,D7
MOVE.L D7,A6
.LOOP:
MOVE.L (A6),A6 ; A6 _NOW_ POINTS TO ENTRY IN INSTABLE
MOVE.L A6,D6
BNE .33
TST.W GENERATE_PPC
BNE .FAIL
BRA .2
.33:
MOVE.L (A6)+,A4
MOVE.L D0,A2
.3: CMPM.B (A4)+,(A2)+
BNE.S .LOOP
TST.B -1(A2)
BNE.S .3
SUB.L D2,D6
LSR.L #3,D6
MOVE.L D6,D0 ; D0=1..112
ADD.L #$100,D0
;*-*
;; Check for sizes
TST.W GENERATE_PPC
BNE iERROR98
MOVEQ #0,D1
CMP.B #'.',(A0) ; SEE IF THERE'S A: .B .W .L .S
BNE.S .4
ADDQ.L #1,A0
MOVE.B (A0)+,D2
LEA .SIZES(PC),A6
MOVEQ #7,D4
.CHKSIZE:
ADDQ.L #1,D1
CMP.B (A6)+,D2
BEQ .4
DBF D4,.CHKSIZE
BRA iERROR31
.4: MOVE.W D0,D4
MOVE.W D0,(A1)+
MOVE.W D1,(A1)+
RTS
.SIZES:
DC.B "BWLSXPDQ",0,0
;*-*
;; Check for ppc commands
.2:
MOVE.L #PPC_INSTAB,D2
MOVE.L HASHVAL(PC),D7
LSL.L #2,D7
ADD.L #PPCHASH,D7
MOVE.L D7,A6
.PLOOP:
MOVE.L (A6),A6 ; A6 _NOW_ POINTS TO ENTRY IN INSTABLE
MOVE.L A6,D6
BNE .P2
TST.W GENERATE_PPC
BEQ .FAIL
BRA .2BACK
.P2:
MOVE.L (A6)+,A4
MOVE.L D0,A2
.P3:CMPM.B (A4)+,(A2)+
BNE.S .PLOOP
TST.B -1(A2)
BNE.S .P3
SUB.L D2,D6
LSR.L #3,D6
MOVE.L D6,D0
MOVEQ #48,D4
MOVE.W D4,(A1)+
MOVE.L D0,(A1)+
CMP.B #".",(A0)
SEQ D0
EXT.W D0
MOVE.W D0,(A1)+
neg.w d0
add.w d0,a0
TST.W GENERATE_PPC
BEQ iERROR99
MOVEQ #-1,D0
RTS
;*-*
;; Fail
.FAIL:
MOVE.L WORK(PC),A2
MOVEQ #0,D0 ; 0=FAIL, ELSE=ISASM
RTS
;*-*
;*-*
;; PC
ASM_PC:
CMP.W #17,D4
BNE .2
CMP.B #')',(A0)
BEQ.S .1
.2:
MOVE.W #$E00,D4
MOVE.W D4,(A1)+
MOVEQ #-1,D0
RTS
.1: CMP.W #17,D4 ;-(A1)
BNE iERROR19
SUBQ.L #2,A1
ADDQ.L #1,A0
SUBQ.W #1,PARSEBRACKET
MOVE.W #$D00,D4
MOVE.W D4,(A1)+
MOVEQ #-1,D0
RTS
;*-*
;; IMM
ASM_PARSEIMM:
BTST #7,CODEPREFS+1
BEQ.S .1
MOVE.L STARTINTERIM(PC),A6
SUBQ.L #2,A6
CMPA.L A6,A1
BEQ PREP
.1: MOVE.W #$F00,D4
MOVE.W D4,(A1)+ ; 11+4
BRA PARSELOOP
;*-*
;; ParseReg
ASM_PARSEREG:
CMP.B #0,2(A2)
BNE REGBACK
MOVE.B (A2),D1 ; D1="A" OR "D"
CMP.B #'D',D1
BEQ.S .1
CMP.B #'A',D1
BNE REGBACK
.1: MOVEQ #0,D0
MOVE.B 1(A2),D0 ; D0="0" .. "9"
SUB.W #48,D0
MOVE.L D0,D7 ; =>COPY
CMP.W #8,D0
BPL iERROR19
CMP.B #'A',D1
BEQ .2
MOVEQ #0,D3 ; D3=ADR.MOD NR.
BRA.S .EXIT ; --> Dx
.2: CMP.W #17,D4 ;-2(A1)
BEQ.S .3
.6: BSET #3,D0 ; --> Ax
MOVEQ #1,D3
BRA.S .EXIT
.3: CMP.B #')',(A0)
BNE.S .6
SUBQ.L #2,A1
ADDQ.L #1,A0
SUBQ.W #1,PARSEBRACKET
CMP.W #8,-2(A1)
BEQ.S .4
.7: CMP.B #'+',(A0)
BEQ.S .5
BSET #4,D0 ; --> (Ax)
MOVEQ #2,D3
BRA.S .EXIT
.4: CMP.L #$10000,-6(A1)
BEQ.S .7
SUBQ.L #2,A1 ; --> -(Ax)
MOVEQ #4,D3
BSET #5,D0
BRA.S .EXIT
.5: ADDQ.L #1,A0 ; --> (Ax)+
MOVEQ #3,D3
ADD.W #%11000,D0
BRA .EXIT
.EXIT: ASL.W #8,D3
ADD.W #$400,D3
CMP.W #4,D7
BEQ.S .8
CMP.W #5,D7
BEQ.S .8
.9: ADD.W D3,D0
MOVE.W D0,D4
MOVE.W D0,(A1)+
MOVE.L WORK(PC),A2
BRA PARSELOOP
.8: CMP.W #$400,D3
BEQ.S .9
BSET #0,WARNINGS+3 ; ISSUE A4/A5 USED WARNING
BRA.S .9
;*-*
;; Hash
MAKEASMHASH:
MOVE.L #ASMHASH,A0 ; A0=TABEL
LEA ASM_INSTAB,A1
MOVE.L A0,A2
MOVE.L #255,D0
.CL:
CLR.L (A2)+ ; CLEAR TABLE
DBRA D0,.CL
.LOOP:
MOVE.L (A1),D0
BEQ.S EX_KWORDS
MOVE.L D0,A2
HASH A2,D0,D1
LSL.L #2,D0
LEA 0(A0,D0.L),A2
MOVE.L (A2),D0 ; READ PREVIOUS LIST (OR NIL)
MOVE.L A1,(A2) ; PUT ENTRY IN LIST
MOVE.L D0,4(A1) ; AND LINK TAIL TO IT
ADDQ.L #8,A1
BRA.S .LOOP
EX_KWORDS:
MOVE.L #AKWHASH,A0 ; A0=TABEL
LEA ASM_KWORDS,A1
MOVE.L A0,A2
MOVE.L #255,D0
.CLX:
CLR.L (A2)+ ; CLEAR TABLE
DBRA D0,.CLX
.LOOPX:
MOVE.L (A1),D0
BEQ.S PPCASMHASH
MOVE.L D0,A2
HASH A2,D0,D1
LSL.L #2,D0
LEA 0(A0,D0.L),A2
MOVE.L (A2),D0 ; READ PREVIOUS LIST (OR NIL)
MOVE.L A1,(A2) ; PUT ENTRY IN LIST
MOVE.L D0,4(A1) ; AND LINK TAIL TO IT
ADDQ.L #8,A1
BRA.S .LOOPX
PPCASMHASH:
MOVE.L #PPCHASH,A0 ; A0=TABEL
LEA PPC_INSTAB,A1
MOVE.L A0,A2
MOVE.L #255,D0
.CLX:
CLR.L (A2)+
DBRA D0,.CLX
.LOOPX:
MOVE.L (A1),D0
BEQ.S .EXX
MOVE.L D0,A2
HASH A2,D0,D1
LSL.L #2,D0
LEA 0(A0,D0.L),A2
MOVE.L (A2),D0
MOVE.L A1,(A2)
MOVE.L D0,4(A1)
ADDQ.L #8,A1
BRA.S .LOOPX
.EXX:
RTS
;*-*
;*-*
;;ASM
ASM_COMPILE: ; GETS INSCODE IN D7
MOVEM.L A2/A5,-(A7) ; JUST A3-A4 STAY PRESERVED
MOVEQ #0,D0
MOVE.W D7,D0 ; D0=INSNR/ADDRESSMODENR
cmp.w #$0f00,d0
beq iERROR12
MOVEQ #0,D1
SUB.W #$100,D0
MOVE.W (A3)+,D1
LEA ASM_INSJOB,A0
LSL.L #2,D0
ADD.L D0,A0
MOVE.L (A0),A0 ; A0=JOBTAB ENTRY
MOVE.L A4,A1 ; A1=ptr START INS IN A4
MOVE.W (A0)+,(A4)+
ASM_LOOP:
MOVEQ #0,D7
MOVE.W (A0)+,D7
BEQ.S .1
SUBQ.L #1,D7
LSL.L #2,D7
MOVE.L ASM_JOBROUTINES(PC,D7.L),A2
JSR (A2)
BRA.S ASM_LOOP
.1: MOVEM.L (A7)+,A2/A5
RTS
ASM_STOP: ; EN JOBCODE PROCESSING
LEA .1(PC),A0
RTS
.1: DC.W 0
SKIP244:
CMP.W #44,(A3)
BNE.S *+4
ADDQ.L #4,A3
RTS
XR:
BSR SKIP244
;; a:REG
ASM_REGID:
CMP.W #IDENT,(A3)
BNE.S .1
MOVE.L A0,-(A7)
MOVE.L 2(A3),A0
BTST #3,5(A0)
BEQ.S .2
MOVE.L D0,-(A7)
MOVE.W #$400,D0
OR.W 10(A0),D0
MOVE.W D0,(A3)
MOVE.L #$2C002C,2(A3)
MOVE.L (A7)+,D0
.2: MOVE.L (A7)+,A0
.1: RTS
;*-*
ASM_JOBROUTINES:
DC.L ASM_NOTIMPL,ASM_PUTSIZE,ASM_PUTSIZEMOVE,ASM_DOEA
DC.L ASM_DOEAMOVEDEST,ASM_COMMA,ASM_ADDSUB,ASM_MOVEQ,ASM_ASQ
DC.L ASM_BCC,ASM_DBCC,ASM_GETADRREG,ASM_SHIFT,ASM_DATAREG
DC.L ASM_BIT,ASM_SIZEA,ASM_SIZEE,ASM_XREG,ASM_DOEXG
DC.L ASM_CMPM,ASM_MOVEM,ASM_TRAP,ASM_MOVEP,ASM_CMPI
DC.L ASM_CPUSUP,ASM_SIZEFIXED,ASM_SIZE0,ASM_SIZEO
DC.L ASM_MONADIC,ASM_FPUSUP,ASM_46EMUL,ASM_DYADIC
DC.L ASM_MMUSUP,ASM_COPY,ASM_FMOVE,ASM_FMOVECR
DC.L ASM_FMOVEM,ASM_FSINCOS,ASM_TRAPCC,ASM_FTST
DC.L ASM_PMMSTD,ASM_PMMLDX,ASM_PMMTST,ASM_PMMMOVE,ASM_PMMEA
DC.L ASM_IMM3B,ASM_MOVEC,ASM_MOVES,ASM_BITFIELD1,ASM_BITFIELD2
DC.L ASM_BITFIELD3,ASM_MULDIV,ASM_LINK,ASM_CPCACHE040,ASM_MOVE16
DC.L ASM_PULSE,ASM_MOVE,ASM_ANDI,ASM_EORI,ASM_ORI
;; Not implemented 1
ASM_NOTIMPL: ; 1
BRA iERROR87 ; TEMP
;*-*
;; Put size 2
ASM_PUTSIZE: ; 2
TST.L D1
BNE .EXISTS
MOVE.W (A0),D1
.EXISTS:
ADDQ.L #2,A0
MOVE.W (A0)+,D2
MOVE.L D1,D0
SUBQ.L #1,D0
BTST D0,D2
BEQ iERROR79 ; 1=B,2=W,3=L...
MOVE.W (A0)+,D2 ; FIND OFFSET
LSL.L D2,D0
OR.W D0,(A1) ; PUT IN INS.WORD
RTS
;*-*
;; Put size (move) 3
ASM_PUTSIZEMOVE: ; 3
TST.L D1
BNE .EXISTS
MOVE.W (A0),D1
.EXISTS:
MOVE.L D1,D0
sUBQ.L #1,D0
ADDQ.L #2,A0
MOVE.W (A0)+,D2
btst d0,d2
beq iERROR79
MOVE.L D1,D0
CMP.W #1,D0
BEQ.S .1
BCHG #0,D0
.1: MOVE.W (A0)+,D2 ; FIND OFFSET
LSL.L D2,D0
OR.W D0,(A1) ; PUT IN INS.WORD
RTS
;*-*
;; EA 4
ASM_DOEA: ; 4
BSR.W ASM_GETEA
MOVE.W (A0)+,D2
BTST D0,D2
BEQ iERROR19
MOVE.W (A0)+,D2
TST.W D2
BMI.S .1 ; OFFS=-1 --> NO OR.W EA
LSL.W D2,D3
OR.W D3,(A1)
.1: RTS
;*-*
;; EA (move dest) 5
ASM_DOEAMOVEDEST: ; 5 MASK IN D3, # IN D0
BSR.W ASM_GETEA
MOVE.W (A0)+,D2
BTST D0,D2
BEQ iERROR19
MOVE.L D3,D0
LSR.W #3,D3 ; UPPER BITS
AND.W #%111,D0 ; LOWER
LSL.W #3,D0
ADD.W D3,D0 ; SWAPPED REGISTER AND MODE FIELDS
MOVE.W (A0)+,D2
LSL.W D2,D0
OR.W D0,(A1)
RTS
;*-*
;; Comma 6
ASM_COMMA: ; 6
CMP.W #COM,(A3)+
BNE iERROR5
RTS
;*-*
;; Add/Sub 7
ASM_ADDSUB: ; 7
BSR ASM_REGID
MOVE.B (A3),D2
CMP.B #4,D2
BEQ.S .1
CMP.B #15,D2
BEQ.S .3
.2: BSR.W ASM_GETEA ; EA --> Dx
BSR SKIP244
OR.W D3,(A1)
BSR.S ASM_COMMA
CMP.B #5,(A3)
BEQ.S .4
MOVEQ #9,D0
BSR.W ASM_GETDATAREG
ADDQ.L #2,A0
RTS
.1: CMP.W #44,2(A3)
BEQ.W .S
ADDQ.L #4,A3
BSR ASM_REGID
MOVE.B (A3),D0
SUBQ.L #4,A3
CMP.B #4,D0
BEQ.S .2
CMP.B #5,D0
BEQ.S .2
.SB: MOVEQ #9,D0
BSR.W ASM_GETDATAREG ; Dx --> EA
BSR.S ASM_COMMA
MOVEQ #0,D7
BSR.W ASM_ANYEA
CMP.W #8,D3 ; FROM DX TO DX, ALWAYS DEST.
BMI.S .DXDX
BSET #0,(A1)
.DXDX: ADDQ.L #2,A0
RTS
.3: BSR ASM_GETEA ; #x --> EA
BSR ASM_COMMA
CMP.B #5,(A3)
BEQ.S .8
BSR ASM_GETEA
OR.W D3,(A1)
MOVE.B (A0)+,(A1)
ADDQ.L #1,A0
MOVE.W #DEST,D2
BTST D0,D2
BEQ iERROR19
RTS
.4: MOVE.B (A1),D6 ; EA --> Ax
CMP.B #13*16,D6
BEQ.S .5
CMP.B #9*16,D6
BNE iERROR19
.5: MOVE.W (A3)+,D6
AND.W #7,D6
LSL.W #1,D6
OR.B D6,(A1)
MOVE.W (A1),D6
AND.W #%11000000,D6
TST.W D6
BEQ iERROR31
BTST #7,D6
BEQ.S .7
BSET #0,(A1)
.7: OR.B #%11000000,1(A1)
ADDQ.L #2,A0
RTS
.8: OR.W #%111100,(A1)
BRA.S .4
.S: ADDQ.L #8,A3
BSR ASM_REGID
MOVE.B (A3),D0
SUBQ.L #8,A3
CMP.B #4,D0
BEQ.W .2
CMP.B #5,D0
BEQ.W .2
BRA.W .SB
;*-*
;; Moveq 8
ASM_MOVEQ: ; 8
CMP.W #$0F00,(A3)+
BNE iERROR30
MOVEM.L A0/D1,-(A7)
CMP.W #LIBC,(A3)
BNE .1_1
ADDQ.L #4,A3
MOVE.W (A3)+,D1
EXT.L D1
ADDQ.L #8,A3
MOVEQ #0,D0
BRA .1_2
.1_1:
BSR ASM_GRABVALUE
.1_2:
TST.L D0
BMI iERROR30
MOVE.L D1,D0
MOVEM.L (A7)+,A0/D1
CMP.L #128,D0
BPL iERROR31
CMP.L #-127,D0
BMI iERROR31
MOVE.B D0,1(A1)
BSR.W ASM_COMMA
MOVEQ #9,D0
BSR ASM_GETDATAREG
RTS
;*-*
;; Addq/Subq 9
ASM_ASQ: ; 9
CMP.W #$0F00,(A3)+
BNE iERROR30
MOVEM.L A0/D1,-(A7)
BSR ASM_GRABVALUE
TST.L D0
BEQ iERROR30
MOVE.L D1,D2
MOVEM.L (A7)+,A0/D1
TST.L D2
BEQ iERROR31
CMP.L #8,D2
BNE.S .1
MOVEQ #0,D2
.1: MOVE.L D2,D3
AND.L #$FFFFFFF8,D3
TST.L D3
BNE iERROR31
AND.W #%111,D2
MOVEQ #9,D3
LSL.W D3,D2
ADD.W D2,(A1)
RTS
;*-*
;; Bcc 10
ASM_BCC: ; 10
CMP.W #IDENT,(A3)+
ADDQ.L #2,A0
BNE iERROR4
MOVE.L (A3)+,A2
CMP.B #LAB,4(A2)
BNE iERROR4
BTST #4,5(A2) ; CHECK IF METHOD
BNE iERROR4
CMP.W #3,D1
BNE .X0
MOVE.W -2(A0),(A1) ; Bcc.L....
MOVEM.L D1/A0,-(A7)
MOVE.W 10(A2),D0
BSR ADDBRANCHPCREL32
MOVEM.L (A7)+,D1/A0
RTS
.X0:CMP.W #4,D1
BEQ.S .X1
CMP.W #1,D1 ; A Bcc.S/Bcc.B ?
BNE.S .1
.X1:MOVE.B #5,1(A1)
BRA.S .2
.1: MOVE.W #0,(A4)+
.2: MOVE.W 10(A2),D0
MOVEM.L D1/A0,-(A7)
CLR.W NEWOP
BSR ADDBRANCH
MOVEM.L (A7)+,D1/A0
RTS
;*-*
;; DBcc 11
ASM_DBCC: ; 11
BSR ASM_REGID
CMP.B #4,(A3)+
BNE iERROR19
MOVE.B (A3)+,D0
OR.B D0,1(A1)
BSR SKIP244
BSR.W ASM_COMMA
CMP.W #IDENT,(A3)+
BNE iERROR4
MOVE.L (A3)+,A2
CMP.B #LAB,4(A2)
BNE iERROR4
BTST #4,5(A2) ; CHECK IF METHOD
BNE iERROR4
MOVE.W #0,(A4)+
MOVE.W 10(A2),D0
MOVEM.L D1/A0,-(A7)
CLR.W NEWOP
BSR ADDBRANCH
MOVEM.L (A7)+,D1/A0
RTS
;*-*
;; Address reg 12
ASM_GETADRREG: ; 12
MOVE.W (A0)+,D0
CMP.B #5,(A3)+
BNE iERROR19
MOVE.B (A3)+,D2
AND.W #%111,D2
LSL.W D0,D2
ADD.W D2,(A1)
RTS
;*-*
;; Shift 13
ASM_SHIFT: ; 13
BSR ASM_REGID
MOVE.B (A3),D2
CMP.B #4,D2
BEQ.S .2
CMP.B #15,D2
BNE.W .1
ADDQ.L #2,A3 ; IMM,REG
CMP.W #VALUE,(A3)+
BNE iERROR30
MOVE.L (A3)+,D4
BEQ iERROR31
CMP.L #8,D4
BNE.S .4
MOVEQ #0,D4
.4: CMP.L #8,D4
BPL iERROR31
TST.L D4
BMI iERROR31
BSR ASM_COMMA
BSR ASM_REGID
CMP.B #4,(A3)
BNE.S .5
ADDQ.L #1,A3
MOVE.B (A3)+,D5
BSR SKIP244
LSL.W #1,D4
OR.B D4,(A1)
OR.B D5,1(A1)
SUBQ.W #1,D1
LSL.W #6,D1
OR.W D1,(A1)
ADDQ.L #2,A0
RTS
.2: BSET #5,1(A1) ; REG,REG
ADDQ.L #1,A3
MOVE.B (A3)+,D3
LSL.B #1,D3
OR.B D3,(A1)
BSR SKIP244
BSR ASM_COMMA
BSR ASM_REGID
CMP.B #4,(A3)+
BNE iERROR19
MOVE.B (A3)+,D3
BSR SKIP244
OR.B D3,1(A1)
SUBQ.W #1,D1
LSL.W #6,D1
OR.W D1,(A1)
ADDQ.L #2,A0
RTS
.5: CMP.W #1,D4
BNE iERROR31
.1: CMP.W #2,D1 ; SHIFT IN MEM NEEDS .W
BNE iERROR31
BSR.W ASM_GETEA
MOVE.W #MDEST,D2 ; SHIFT IN MEMORY
BTST D0,D2
BEQ iERROR19
MOVE.W (A0)+,(A1) ; NEW OPCODE
OR.W D3,(A1) ; PUT IN EA
RTS
;*-*
;; Data reg 14
ASM_DATAREG: ; 14
MOVE.W (A0)+,D0
BSR ASM_REGID
CMP.B #4,(A3)+
BNE iERROR19
MOVEQ #0,D2
MOVE.B (A3)+,D2
LSL.W D0,D2
ADD.W D2,(A1)
BSR SKIP244
RTS
;*-*
;; Bit 15
ASM_BIT: ; 15
CMP.B #$F,(A3)
BNE.S .1
ADDQ.L #2,A3 ; #IMM,EA
CMP.W #VALUE,(A3)+
BNE iERROR30
MOVE.L (A3)+,D2
CHKB D2,D3,iERROR31
MOVE.W D2,(A4)+
MOVE.W (A0)+,(A1) ; NEW OPCODE
BSR ASM_COMMA
BSR.W ASM_GETEA
MOVE.W #BTDEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
RTS
.1: BSR ASM_REGID
CMP.B #4,(A3)+ ; Dx,EA
BNE iERROR19
MOVE.B (A3)+,D2
LSL.B #1,D2
OR.B D2,(A1)
BSR SKIP244
BSR ASM_COMMA
BSR.W ASM_GETEA
MOVE.W #BTDEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
ADDQ.L #2,A0
RTS
;*-*
;; SizeA 16
ASM_SIZEA: ; 16
TST.W D1
bNE .EXISTS
MOVE.W (A0),D1
.EXISTS:
ADDQ.L #2,A0
MOVE.L D1,D0
SUBQ.L #1,D0
MOVE.W (A0)+,D2
BTST D0,D2
BEQ iERROR79
CMP.W #1,D1
BEQ iERROR79
CMP.W #3,D1
BEQ.S .1
RTS
.1: BSET #0,(A1)
RTS
;*-*
;; SizeE 17
ASM_SIZEE: ; 17
TST.W D1
bNE .EXISTS
MOVE.W (A0),D1
.EXISTS:
ADDQ.L #2,A0
MOVE.L D1,D0
SUBQ.L #1,D0
MOVE.W (A0)+,D2
BTST D0,D2
BEQ iERROR79
CMP.W #1,D1
BEQ iERROR79
CMP.W #3,D1
BEQ.S .1
RTS
.1: BSET #6,1(A1)
RTS
;*-*
;; Xreg 18
ASM_XREG: ; 18
BSR ASM_REGID
MOVE.B (A3)+,D2
MOVE.B (A3)+,D3
BSR SKIP244
BSR ASM_COMMA
BSR ASM_REGID
MOVE.B (A3)+,D4
MOVE.B (A3)+,D5
BSR SKIP244
CMP.B D2,D4
BNE iERROR19
CMP.B #4,D2
BEQ.S .1
CMP.B #8,D2
BNE iERROR19
BSET #3,1(A1)
.1: AND.B #%111,D3
AND.B #%111,D5
OR.B D3,1(A1)
LSL.B #1,D5
OR.B D5,(A1)
RTS
;*-*
;; Exg 19
ASM_DOEXG: ; 19
BSR ASM_REGID
MOVE.B (A3)+,D2
MOVE.B (A3)+,D3
CMP.B #4,D2
BNE.S .1
BSR SKIP244
LSL.B #1,D3
OR.B D3,(A1)
BSR ASM_COMMA
BSR ASM_REGID
MOVE.B (A3)+,D2
MOVE.B (A3)+,D3
AND.B #%111,D3
OR.B D3,1(A1)
CMP.B #4,D2
BNE.S .2
BSR SKIP244
BSET #6,1(A1) ; d,d
RTS
.2: BSET #7,1(A1) ; d,a
BSET #3,1(A1)
RTS
.1: CMP.B #5,D2
BNE iERROR19
AND.B #%111,D3
OR.B D3,1(A1)
BSR ASM_COMMA
BSR ASM_REGID
MOVE.B (A3)+,D2
MOVE.B (A3)+,D3
AND.B #%111,D3
LSL.B #1,D3
OR.B D3,(A1)
CMP.B #4,D2
BNE.S .3
BSR SKIP244
BSET #7,1(A1) ; d,a
BSET #3,1(A1)
RTS
.3: BSET #6,1(A1) ; a,a
BSET #3,1(A1)
RTS
;*-*
;; Cmpm 20
ASM_CMPM: ; 20
CMP.B #7,(A3)+
BNE iERROR19
MOVE.B (A3)+,D2
BSR ASM_COMMA
CMP.B #7,(A3)+
BNE iERROR19
AND.W #$7,D2
OR.W D2,(A1)
MOVE.B (A3)+,D2
AND.W #$7,D2
LSL.B #1,D2
OR.B D2,(A1)
RTS
;*-*
;; Movem 21
ASM_MOVEM: ; 21
BSR ASM_REGID
MOVE.B (A3),D0
BEQ.S .1B
CMPI.B #6,D0
BMI.S .1
.1B: ADDQ.L #2,A4
BSR.W ASM_GETEA ; (Ax)+,REGLIST
MOVE.W #MMSRC,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSET #2,(A1)
BSR ASM_COMMA
BSR ASM_REGID
BSR.S .2
MOVE.W D2,2(A1)
RTS
.1: BSR.S .2
MOVE.W D2,(A4)+
MOVE.W D7,-(A7)
BSR ASM_COMMA
BSR.W ASM_GETEA ; REGLIST,-(Ax)
MOVE.W (A7)+,D7
CMP.W #4,D0
BNE.S .10
MOVE.W D7,2(A1)
.10: MOVE.W #MMDEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
RTS
.2: MOVEQ #0,D2 ; MASK
MOVEQ #0,D7
MOVE.B (A3)+,D0 ; GET REGLIST
BEQ iERROR0
.6: MOVEQ #4,D6
CMP.B #4,D0
BEQ.S .4
CMP.B #5,D0
BEQ.S .5
BRA iERROR19
.X: SUBQ.L #2,A3
RTS
.4: MOVEQ #0,D4
MOVE.B (A3)+,D4 ; Dx
BSR SKIP244
BSET D4,D2
MOVEQ #15,D3
SUB.L D4,D3
BSET D3,D7
.9: MOVE.W (A3)+,D5
CMP.W #10,D5
BEQ.S .7
CMP.W #8,D5
BNE.S .X
BSR ASM_REGID
CMP.B (A3)+,D6
BNE iERROR19
MOVEQ #0,D5
MOVE.B (A3)+,D5
BSR SKIP244
.8: ADDQ.L #1,D4
BSET D4,D2
MOVEQ #15,D3
SUB.L D4,D3
BSET D3,D7
CMP.L D5,D4
BMI.S .8
BEQ.S .9
BRA iERROR19
.5: MOVEQ #5,D6 ; Ax
BRA.S .4
.7: BSR ASM_REGID
MOVE.B (A3)+,D0
BRA.S .6
;*-*
;; Trap 22
ASM_TRAP: ; 22
CMP.L #$0F000001,(A3)+
BNE iERROR19
MOVE.L (A3)+,D2
MOVE.L D2,D3
AND.L #$FFFFFFF0,D3
TST.L D3
BNE iERROR31
OR.W D2,(A1)
RTS
;*-*
;; Movep 23
ASM_MOVEP: ; 23
CMP.B #4,(A3)
BNE.S .1
ADDQ.L #1,A3
BSET #7,1(A1) ; Dx,x(Ax)
MOVE.B (A3)+,D2
LSL.B #1,D2
OR.B D2,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #5,D0
BNE iERROR19
AND.W #7,D3
OR.W D3,(A1)
RTS
.1: BSR ASM_GETEA ; x(Ax),Dx
CMP.W #5,D0
BNE iERROR19
AND.W #7,D3
OR.W D3,(A1)
BSR ASM_COMMA
CMP.B #4,(A3)+
BNE iERROR19
MOVE.B (A3)+,D2
LSL.B #1,D2
OR.B D2,(A1)
RTS
;*-*
;; Cmpi 24
ASM_CMPI: ; 24
CMP.W #$0F00,(A3)
BEQ .1
RTS
.1: MOVE.B #$C,(A1) ; SET TO CMPI
BSR ASM_GETEA
CMP.W #11,D0
BNE iERROR19
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.W #DEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_STOP
RTS
;*-*
;; CpuSup 25
ASM_CPUSUP: ; 25
MOVE.W ASMCPU(PC),D0
AND.W (A0)+,D0
BEQ iERROR53
RTS
;*-*
;; SizeFixed 26
ASM_SIZEFIXED:
CMP.W (A0)+,D1
BNE iERROR31
RTS
;*-*
;; Size0 27
ASM_SIZE0:
TST.W D1
BNE iERROR79
RTS
;*-*
;; SizeO 28
ASM_SIZEO:
TST.W D1
BNE .EXISTS
MOVE.W (A0),D1
.EXISTS:
ADDQ.L #2,A0
MOVe.W (A0)+,D2
MOVE.L D1,D0
SUBQ.L #1,D0
BTST D0,D2
BEQ iERROR79
RTS
;*-*
;; Monadic 29
ASM_MONADIC:
MOVE.W (A0)+,(A4)+
CMP.W #47,(A3)
BNE .EA
CMP.W #5,D1
BNE iERROR79
BSR ASM_GETFPREG
MOVE.W D2,D3
CMP.W #COM,(A3)
BNE .FP
BSR ASM_COMMA
BSR ASM_GETFPREG
.FP:LSL.W #8,D3
LSL.W #2,D3
LSL.W #7,D2
OR.W D2,2(A1)
OR.W D3,2(A1)
RTS
.EA:
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
TST.W D0
BNE .EA2
CMp.W #5,D1
BPL iERROR79
.EA2:
TST.W (A0)+
BNE .EA3
CMP.W #6,D1
BEQ iERROR79
.EA3:
OR.W D3,(A1)
MOVE.L D1,D2
CMp.W #8,D1
BEQ iERROR79
LSL.W #1,D2
MOVE.W .SIZES(PC,D2),D2
OR.W D2,2(A1)
BSR ASM_COMMA
BSR ASM_GETFPREG
LSL.W #7,D2
OR.W D2,2(A1)
RTS
.SIZES:
DC.W 0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; FpuSup 30
ASM_FPUSUP:
MOVE.W (A0)+,D2
MOVE.W EFPU,D0
AND.W D0,D2
BEQ iERROR53
RTS
;*-*
;; 040/060 emulated 31
ASM_46EMUL:
CMP.W #2,EFPU
BNE .X
BSET #7,WARNINGS+3
.X: RTS
;*-*
;; Dyadic 32
ASM_DYADIC:
MOVE.W (A0)+,(A4)+
CMP.W #47,(A3)
BNE .EA
CMP.W #5,D1
BNE iERROR79
BSR ASM_GETFPREG
MOVE.W D2,D3
BSR ASM_COMMA
BSR ASM_GETFPREG
.FP:LSL.W #8,D3
LSL.W #2,D3
LSL.W #7,D2
OR.W D2,2(A1)
OR.W D3,2(A1)
RTS
.EA:
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
TST.W D0
BNE .EA2
CMp.W #5,D1
BPL iERROR79
.EA2:
TST.W (A0)+
BNE .EA3
CMP.W #6,D1
BEQ iERROR79
.EA3:
OR.W D3,(A1)
MOVE.L D1,D2
CMp.W #8,D1
BEQ iERROR79
LSL.W #1,D2
MOVE.W .SIZES(PC,D2),D2
OR.W D2,2(A1)
BSR ASM_COMMA
BSR ASM_GETFPREG
LSL.W #7,D2
OR.W D2,2(A1)
RTS
.SIZES:
DC.W 0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; MmuSup 33
ASM_MMUSUP:
MOVE.W (A0)+,D2
MOVE.W EMMU,D0
AND.W D0,D2
BEQ iERROR53
RTS
;*-*
;; Copy 34
ASM_COPY:
MOVE.W (A0)+,(A4)+
RTS
;*-*
;; Fmove 35
ASM_FMOVE:
CMP.W #47,(A3)
BNE .EA
CMP.W #$24,2(A3)
BPL .FPCR1
BSR ASM_GETFPREG
MOVE.W D2,D7
BSR ASM_COMMA
CMP.W #47,(A3)
BNE .EAX
CMP.W #5,D1
BNE iERROR79 ; FP to FP
BSR ASM_GETFPREG
LSL.W #8,D7
LSL.W #2,D7
LSL.W #7,D2
OR.W D2,2(A1)
OR.W D7,2(A1)
RTS
.EAX:
BSR ASM_GETEA
MOVE.L #DEST,D2
BTST D0,D2
BEQ iERROR19
TST.W D0
BNE .EAX1
CMP.W #5,D1
BPL iERROR79
.EAX1:
OR.W D3,(A1)
LSL.W #7,D7
OR.W D7,2(A1)
BSR .ADJUSTSIZE
OR.W #$2000,2(A1)
CMP.W #6,D1
BNE .X
CMP.W #23,(a3)
BEQ .EXT
.X: RTS
.EXT:
ADDQ.L #2,A3
CMP.B #4,(A3)
BEQ .EXTD
CMp.L #$0f000001,(a3)+
bne iERROR19
move.l (a3)+,d2
bmi iERROR31
cmp.l #64,d2
bpl iERROR31
OR.W D2,2(A1)
CMP.W #24,(A3)+
BNE iERROR29
RTS
.EXTD:
OR.W #$1000,2(A1)
MOve.W (a3)+,d2
and.l #7,d2
lsl.w #4,d2
or.w d2,2(A1)
cmp.w #24,(a3)+
bne iERROR29
RTS
.FPCR1:
CMP.W #3,D1
BNE iERROR79
ADDq.L #2,A3
MOVE.W (A3)+,D2
cmp.w #$27,d2
bpl iERROR80
sub.w #$24,d2
beq .F11
cmp.w #1,d2
beq .F12
move.w #$A400,D2
BRA .F13
.F11:
move.w #$a800,d2
bra .F13
.F12:
MOVe.W #$B000,d2
.F13:
move.w d2,2(a1)
bsr ASM_COMMA
BSR ASM_GETEA
MOVe.W #DEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
RTS
.EA:
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
TST.W D0
BNE .EA2
CMp.W #5,D1
BPL iERROR79
.EA2:
OR.W D3,(A1)
BSR ASM_COMMA
CMP.W #$24,2(A3)
BPL .FPCR2
BSR ASM_GETFPREG
LSL.W #7,D2
OR.W D2,2(A1)
BSR .ADJUSTSIZE
RTS
.FPCR2:
CMP.W #3,D1
BNE iERROR79
CMP.W #47,(a3)+
BNE iERROR80
MOVE.W (A3)+,D2
cmp.w #$27,d2
bpl iERROR80
sub.w #$24,d2
beq .F21
cmp.w #1,d2
beq .F22
move.w #$8400,D2
BRA .F23
.F21:
move.w #$8800,d2
bra .F23
.F22:
MOVe.W #$9000,d2
.F23:
move.w d2,2(a1)
OR.W D3,(A1)
RTS
.ADJUSTSIZE:
MOVE.L D1,D2
LSL.W #1,D2
MOVE.W .SIZES(PC,D2),D2
OR.W D2,2(A1)
RTS
.SIZES:
DC.W 0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; Fmovecr 36
ASM_FMOVECR:
CMP.L #$0f000001,(a3)+
BNE iERROR30
MOVE.L (a3)+,D2
BMI iERROR31
CMP.L #$7F,D2
BGT iERROR31
OR.W D2,2(A1)
BSR ASM_COMMA
BSR ASM_GETFPREG
LSL.W #7,D2
OR.W D2,2(A1)
RTS
;*-*
;; Fmovem 37
ASM_FMOVEM:
CMP.W #3,D1 ; ".L"?
BEQ .FPCR_LIST
CMP.W #47,(A3)
BEQ .01 ; FP reg list
BSR ASM_GETEA
MOVE.L #MMSRC+1,D2
BTST D0,D2
BEQ iERROR19
TST.W D0
BEQ .02 ; mask in Dx
OR.W D3,(A1)
BSR ASM_COMMA
CMP.W #47,(A3)
BEQ .03 ; restore list
;; FMOVEM <ea>,Dx
Bsr ASM_GETEA
TST.W D0
BNE iERROR19
LSL.W #3,D3
or.w d3,2(a1)
OR.W #$C800,2(A1) ; FMOVEM.X <ea>,Dx
RTS
;*-*
;; FMOVEM <ea>,<list>
.03:
BSR .COMBINE_LIST
MOVE.L D0,D7
BSR .FLIP
OR.W D2,2(A1)
OR.W #$D000,2(A1) ; FMOVEM.X <ea>,<list>
RTS
;*-*
;; FMOVEM Dx,<ea>
.02:
LSL.W #3,D3
OR.W D3,2(A1)
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #MMDEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
CMP.W #4,d0
bne .X2
OR.W #$E800,2(A1) ; FMOVEM.X Dx,<ea>
RTS
.X2:OR.W #$F800,2(A1)
RTS
;*-*
;; FMOVEM <list>,<ea>
.01:
BSR .COMBINE_LIST
MOVE.L D2,D7
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #MMDEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
CMP.W #4,D0
BNE .X1
OR.W #$E000,2(A1) ; FMOVEM.X <list>,<ea>
OR.W D7,2(a1)
RTS
.X1:OR.W #$F000,2(A1)
BSR .FLIP
OR.W D2,2(A1)
RTS
;*-*
;; Flip bits
.FLIP:
MOVEQ #7,D0
MOVEQ #0,D2
.FLIPX:
LSR.W #1,D7
BCC .FLIPY
BSET D0,D2
.FLIPY:
DBF D0,.FLIPX
RTS
;*-*
;; Combine mask list
.COMBINE_LIST:
MOVEQ #0,D0
BSR ASM_GETFPREG
BSET D2,D0 ; D0 - mask
MOVE.L D2,D7
.LOOP:
CMP.W #10,(A3)
BEQ .ONE
CMP.W #8,(A3)
BNE .XXX
ADDQ.L #2,A3
ADDQ.L #1,D7
BSR ASM_GETFPREG
CMP.W D2,D7
BGT iERROR19
.L1:
BTST D7,D0
BNE iERROR50
BSET D7,D0
ADDQ.B #1,D7
CMP.W D2,D7
BLE .L1
CMP.W #8,(A3)
BEQ iERROR19
CMP.W #10,(A3)
BNE .XXX
.ONE:
ADDQ.L #2,A3
BSR ASM_GETFPREG
BTST D2,D0
BNE iERROR50
BSET D2,D0
MOVE.L D2,D7
BRA .LOOP
.XXX:
MOVE.L D0,D2
RTS
;*-*
;; FPcr
.FPCR_LIST:
BSR .COMBINE_FPCR
OR.W D2,2(A1)
OR.W #$A000,2(A1)
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.W #MMDEST,D2
bTST D0,D2
bEQ iERROR19
OR.W D3,(A1)
RTS
.CREA:
BSR ASM_GETEA
MOVE.W #MMSRC,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
BSR .COMBINE_FPCR
OR.W d2,2(A1)
OR.W #$C000,2(A1)
RTS
;*-*
;; Combine FPcr
.COMBINE_FPCR:
CMP.W #47,(A3)+
BNE iERROR80
MOVEQ #0,D2
.CFLOOP:
MOVE.W (A3)+,D0
SUB.L #$24,D0
BMI iERROR80
CMp.W #1,D0
BMI .x1
BEQ .x2
BTST #10,d2
bne iERROR50
bset #10,d2
bra .x3
.x2:
btst #12,d2
bne iERROR50
bset #12,d2
bra .x3
.x1:
btst #11,d2
bne iERROR50
bset #11,d2
.x3:
cmp.l #$000a002f,(a3)+
beq .CFLOOP
subq.l #4,a3
rts
;*-*
;*-*
;; Fsincos 38
ASM_FSINCOS:
CMP.W #47,(A3)
BNE .EA
CMP.W #5,D1
BNE iERROR79
BSR ASM_GETFPREG
LSL.W #8,D2
LSL.W #2,D2
OR.W D2,2(A1)
BRA .REST
.EA:
BSR .ADJUSTSIZE
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
TST.W D0
BNE .SKP
CMP.W #5,D1
BPL iERROR79
.SKP:
OR.W D3,(A1)
.REST:
BSR ASM_COMMA
BSR ASM_GETFPREG
MOVE.L D2,D7
CMP.W #19,(A3)+
BNE iERROR81
BSR ASM_GETFPREG
LSL.W #7,D2
OR.W D2,2(A1)
OR.W D7,2(A1)
RTS
.ADJUSTSIZE:
MOVE.L D1,D2
LSL.W #1,D2
MOVE.W .SIZES(PC,D2),D2
OR.W D2,2(A1)
RTS
.SIZES:
DC.W 0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; Trapcc 39
ASM_TRAPCC:
CMP.L #$0F000001,(A3)
BEQ .PARAM
ADD.W #2,(A1)
RTS
.PARAM:
ADDQ.L #4,A3
MOVE.L (A3)+,D2
CMP.W #2,D1
BEQ .WRD
ADD.W #1,(A1)
MOVE.L D2,(A4)+
RTS
.WRD:
CHKW D2,D7,iERROR31
MOVE.W D2,(A4)+
RTS
;*-*
;; Ftst 40
ASM_FTST:
CMP.W #47,(A3)
BNE .EA
CMP.W #5,D1
BNE iERROR79
BSR ASM_GETFPREG
lsl.w #8,d2
lsl.w #2,d2
or.w d2,2(a1)
rts
.EA:
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
OR.W d3,(a1)
TST.W D0
BNE .SKP
CMP.W #5,D1
BPl iERROR79
.SKP:
BSR .ADJUSTSIZE
RTS
.ADJUSTSIZE:
MOVE.L D1,D2
LSL.W #1,D2
MOVE.W .SIZES(PC,D2),D2
OR.W D2,2(A1)
RTS
.SIZES:
DC.W 0,$5800,$5000,$4000,$4400,$4800,$4c00,$5400,$0000
;*-*
;; Standard MMU 41
ASM_PMMSTD:
CMP.W #47,(A3)
BNE .EA
ADDQ.L #2,A3
MOVE.W (a3)+,D2
CMP.W #2,D2
BPL iERROR82
OR.W D2,2(A1)
BRA .C
.EA:
BSR ASM_GETEA
TST.W D0
BNE .040
OR.W #8,D3
OR.W D3,2(A1)
.C:
BSR ASM_COMMA
CMP.L #$0f000001,(a3)+
BNE iERROR30
MOVE.L (A3)+,D2
BMI iERROR31
CMP.L #8,D2
BPL iERROR31
LSL.W #5,D2
OR.W D2,2(A1)
MOVE.W #0,(A0)
CMP.W #COM,(A3)
BEQ .C2
RTS
.C2:
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #%000111100100,D2
BTST D0,D2
BEQ iERROR19
OR.W d3,(a1)
or.w #$800,2(a1)
rts
.040:
TST.W (A0)
BEQ iERROR19
CMP.W #2,ECPU
BLT iERROR53
ADDQ.L #2,A0
CMP.W #2,D0
BNE iERROR19
MOVE.W #$F508,(A1)
AND.W #7,D3
OR.W #8,D3
OR.W D3,(A1)
LEA 2(A1),A4
RTS
;*-*
;; MMU Load 42
ASM_PMMLDX:
CMP.W #47,(A3)
BNE .EA
ADDQ.L #2,A3
MOVE.W (a3)+,D2
CMP.W #2,D2
BPL iERROR82
OR.W D2,2(A1)
BRA .C
.EA:
BSR ASM_GETEA
TST.W D0
BNE iERROR19
OR.W #8,D3
OR.W D3,2(A1)
.C:
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #%000111100100,D2
BTST D0,D2
BEQ iERROR19
OR.W d3,(a1)
rts
;*-*
;; MMU Test 43
ASM_PMMTST:
CMP.W #47,(A3)
BNE .EA
ADDQ.L #2,A3
MOVE.W (a3)+,D2
CMP.W #2,D2
BPL iERROR82
OR.W D2,2(A1)
BRA .C
.EA:
BSR ASM_GETEA
TST.W D0
BNE .040
OR.W #8,D3
OR.W D3,2(A1)
.C:
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #%000111100100,D2
BTST D0,D2
BEQ iERROR19
OR.W d3,(a1)
BSR ASM_COMMA
CMP.L #$0f000001,(a3)+
BNE iERROR30
MOVE.L (A3)+,D2
BMI iERROR31
CMP.L #8,D2
BPL iERROR31
LSL.W #8,D2
LSL.W #2,D2
OR.W D2,2(A1)
MOVE.W #0,(A0)
CMP.W #COM,(A3)
BEQ .C2
RTS
.C2:
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #1,D0
BNE iERROR19
OR.W #$100,2(a1)
AND.L #$7,D3
LSL.W #5,D3
OR.W D3,2(a1)
RTS
.040:
CMP.W #2,D0
BNE iERROR19
CMP.W #2,ECPU
BMI iERROR53
ADDQ.L #2,A0
MOVE.W (A0)+,(A1)
AND.L #7,D3
OR.W D3,(A1)
LEA 2(A1),A4
RTS
;*-*
;; MMU Move 44
ASM_PMMMOVE:
CMP.W #47,(A3)
BEQ .II
BSR .EA
BSR ASM_COMMA
BSR .SEL
RTS
.II:BSR .SEL
BSR ASM_COMMA
BSR .EA
RTS
.EA:
BSR ASM_GETEA
MOVE.L #%000111111100,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
RTS
.SEL:
CMP.W #47,(a3)+
BNE iERROR82
MOVE.W (A3)+,D2
CMP.W #3,D1
BEQ .LO
CMP.W #8,D1
BEQ .QO
CMP.W #2,D1
BEQ .WO
BRA iERROR79
;; Long ones
.LO:CMP.W #3,D2
BNE .L0
MOVE.W #$4200,D2
BRA .LZ
.L0:CMP.W #$13,D2
BNE .L1
MOVE.W #$A00,D2
BRA .LZ
.L1:CMP.W #$14,D2
BNE .L2
MOVe.W #$E00,D2
BRA .LZ
.L2:BRA iERROR82
.LZ:OR.W D2,2(A1)
RTS
;*-*
;; Quad ones
.QO:CMP.W #$10,D2
BNE .Q0
MOVE.W #$4A00,D2
BRA .QZ
.Q0:CMP.W #$1b,D2
BNE .Q1
MOVE.W #$4600,D2
BRA .QZ
.Q1:CMP.W #$12,D2
BNE .Q2
MOVE.W #$4e00,D2
BRA .QZ
.Q2:BRA iERROR82
.QZ:OR.W D2,2(A1)
RTS
;*-*
;; Word ones
.WO:CMP.W #$E,D2 ;MMUSR
BNE .W0
MOVE.W #$6200,D2
BRA .WZ
.W0:CMP.W #$16,D2 ;BAC0
BNE .W1
MOVE.W #$7600,D2
BRA .WZ
.W1:CMP.W #$30,D2 ;BAC1
BNE .W2
MOVE.W #$7604,D2
BRA .WZ
.W2:CMP.W #$31,D2 ;BAC2
BNE .W3
MOVE.W #$7608,D2
BRA .WZ
.W3:CMP.W #$32,D2 ;BAC3
BNE .W4
MOVE.W #$760c,D2
BRA .WZ
.W4:CMP.W #$33,D2 ;BAC4
BNE .W5
MOVE.W #$7610,D2
BRA .WZ
.W5:CMP.W #$34,D2 ;BAC5
BNE .W6
MOVE.W #$7614,D2
BRA .WZ
.W6:CMP.W #$35,D2 ;BAC6
BNE .W7
MOVE.W #$7618,D2
BRA .WZ
.W7:CMP.W #$36,D2 ;BAC7
BNE .W8
MOVE.W #$761C,D2
BRA .WZ
.W8:CMP.W #$15,D2 ;BAD0
BNE .W9
MOVE.W #$7200,D2
BRA .WZ
.W9:CMP.W #$29,D2 ;BAD1
BNE .WA
MOVE.W #$7204,D2
BRA .WZ
.WA:CMP.W #$2a,D2 ;BAD2
BNE .WB
MOVE.W #$7208,D2
BRA .WZ
.WB:CMP.W #$2b,D2 ;BAD3
BNE .WC
MOVE.W #$720c,D2
BRA .WZ
.WC:CMP.W #$2c,D2 ;BAD4
BNE .WD
MOVE.W #$7210,D2
BRA .WZ
.WD:CMP.W #$2d,D2 ;BAD5
BNE .WE
MOVE.W #$7214,D2
BRA .WZ
.WE:CMP.W #$2e,D2 ;BAD6
BNE .WF
MOVE.W #$7218,D2
BRA .WZ
.WF:CMP.W #$2f,D2 ;BAD7
BNE .WG
MOVE.W #$721C,D2
BRA .WZ
.WG:BRA iERROR82
.WZ:OR.W D2,2(A1)
RTS
;*-*
;*-*
;; MMU EA 45
ASM_PMMEA:
BSR ASM_GETEA
MOVE.W (A0)+,D2
BTST D0,D2
BEQ iERROR19
AND.L #7,D3
OR.W D3,(A1)
RTS
;*-*
;; Immediate 3 bit 46
ASM_IMM3B:
CMp.L #$0f000001,(a3)+
BNE iERROR30
MOVE.L (a3)+,D2
BMI iERROR31
CMP.L #8,D2
BPL iERROR31
OR.W D2,(A1)
RTS
;*-*
;; Movec 47
ASM_MOVEC:
CMP.W #47,(A3)
BNE .EA_TO_CR
BSR .COMBINE_REG
BSR ASM_COMMA
BSR .COMBINE_EA
RTS
.EA_TO_CR:
BSR .COMBINE_EA
BSR ASM_COMMA
BSR .COMBINE_REG
ADD.W #1,(A1)
RTS
.COMBINE_REG:
CMP.W #47,(A3)+
BNE iERROR83
MOVE.W (A3)+,D2
CMP.W #$12,D2
BPL iERROR83
LSL.W #1,D2
MOVE.W .REGS(PC,D2),D2
OR.W D2,2(A1)
RTS
.REGS:
DC.W $0000,$0001,$0002,$0003,$0004,$0005,$0006,$0007,$0008
DC.W $0800,$0801,$0802,$0803,$0804,$0805,$0806,$0807,$0808
.COMBINE_EA:
BSR ASM_GETEA
MOVE.L #3,D2
BTST D0,D2
BEQ iERROR19
LSL.W #8,D3
LSL.W #4,D3
OR.W D3,2(A1)
RTS
;*-*
;; Moves 48
ASM_MOVES:
MOVEQ #0,D2
CMP.W #1,D1
BEQ .SX
ADD.W #$40,D2
CMP.W #2,D1
BEQ .SX
ADD.W #$40,D2
.SX:
ADD.W D2,(A1)
BSR ASM_GETEA
MOVE.L #%000011111111,D2
BTST D0,D2
BEQ iERROR19
CMP.W #2,D0
BMI .SPACE
OR.W D3,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #2,D0
BPL iERROR19
LSL.W #8,D3
LSL.W #4,D3
OR.W D3,2(A1)
RTS
.SPACE:
LSL.W #8,D3
LSL.W #4,D3
OR.W #$800,D3
OR.W D3,2(A1)
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #%000011111100,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
RTS
;*-*
;; BitField1 49
ASM_BITFIELD1:
BSR ASM_GETEA
MOVE.L #DEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
CMP.W #23,(A3)+
BNE iERROR19
BSR .GET
MOVE.L D2,D7
CMP.W #19,(A3)+
BNE iERROR81
BSR .GET
LSL.W #6,D7
OR.W D7,2(A1)
OR.W D2,2(A1)
CMP.W #24,(A3)+
BNE iERROR29
RTS
.GET:
CMP.W #$0001,(A3)
BNE .EA
ADDQ.L #2,A3
MOVE.L (A3)+,D2
BMI iERROR31
CMP.L #32,D2
BPL iERROR31
RTS
.EA:
BSR ASM_GETEA
TST.W D0
BNE iERROR19
MOVE.L D3,D2
OR.W #$20,D2
RTS
;*-*
;; BitField2 50
ASM_BITFIELD2:
BSR ASM_GETEA
MOVE.L #DEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
CMP.W #23,(A3)+
BNE iERROR19
BSR .GET
MOVE.L D2,D7
CMP.W #19,(A3)+
BNE iERROR81
BSR .GET
LSL.W #6,D7
OR.W D7,2(A1)
OR.W D2,2(A1)
CMP.W #24,(A3)+
BNE iERROR29
BSR ASM_COMMA
BSR ASM_GETEA
TST.W D0
BNE iERROR19
LSL.W #8,D3
LSL.W #4,D3
OR.W D3,2(A1)
RTS
.GET:
CMP.W #$0001,(A3)
BNE .EA
ADDQ.L #2,A3
MOVE.L (A3)+,D2
BMI iERROR31
CMP.L #32,D2
BPL iERROR31
RTS
.EA:
BSR ASM_GETEA
TST.W D0
BNE iERROR19
MOVE.L D3,D2
OR.W #$20,D2
RTS
;*-*
;; BitField3 51
ASM_BITFIELD3:
BSR ASM_GETEA
TST.W D0
BNE iERROR19
LSL.W #8,D3
LSL.W #4,D3
OR.W D3,2(A1)
BSR ASM_COMMA
BSR ASM_GETEA
MOVE.L #DEST,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
CMP.W #23,(A3)+
BNE iERROR19
BSR .GET
MOVE.L D2,D7
CMP.W #19,(A3)+
BNE iERROR81
BSR .GET
LSL.W #6,D7
OR.W D7,2(A1)
OR.W D2,2(A1)
CMP.W #24,(A3)+
BNE iERROR29
RTS
.GET:
CMP.W #$0001,(A3)
BNE .EA
ADDQ.L #2,A3
MOVE.L (A3)+,D2
BMI iERROR31
CMP.L #32,D2
BPL iERROR31
RTS
.EA:
BSR ASM_GETEA
TST.W D0
BNE iERROR19
MOVE.L D3,D2
OR.W #$20,D2
RTS
;*-*
;; Mul/Div 52
ASM_MULDIV:
CMP.W #2,D1
BEQ .WRD
MOVE.W (A0)+,(A1)
MOVE.W (A0)+,(A4)+
MOVE.W ASMCPU(PC),D2
AND.L #$FE,D2
BEQ iERROR53
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
TST.W D0
BNE iERROR19
MOVE.W D3,D7
CMP.W #19,(A3)
BNE .X1
ADDQ.L #2,A3
BSR ASM_GETEA
TST.W D0
BNE iERROR19
.X1:LSL.W #8,D3
LSL.W #4,D3
OR.W D3,2(A1)
OR.W D7,2(A1)
RTS
.WRD:
ADDQ.L #4,A0
BSR ASM_GETEA
MOVE.L #NASRC,D2
BTST D0,D2
BEQ iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
TST.W D0
BNE iERROR19
LSL.W #8,D3
LSL.W #1,D3
OR.W D3,(A1)
RTS
;*-*
;; Link 53
ASM_LINK:
CMP.W #3,D1
BEQ .LONG
BSR ASM_GETEA
CMP.W #1,D0
BNE iERROR19
AND.L #7,D3
OR.W D3,(A1)
BSR ASM_COMMA
CMP.L #$0F000001,(A3)+
BNE iERROR30
MOVE.L (A3)+,D0
CHKW D0,D2,iERROR31
MOVE.W D0,(A4)+
RTS
.LONG:
MOVE.W ASMCPU,D2
AND.L #%111110,D2
BEQ iERROR53
MOVE.W #$4800,(A1)
BSR ASM_GETEA
CMP.W #1,D0
BNE iERROR19
OR.W D3,(A1)
BSR ASM_COMMA
CMP.L #$0F000001,(A3)+
BNE iERROR30
MOVE.L (A3)+,(A4)+
RTS
;*-*
;; CpCache 040+ 54
ASM_CPCACHE040:
CMP.W #47,(A3)+
BNE iERROR84
MOVEQ #0,D2
MOVE.W (A3)+,D2
SUB.L #$37,D2
BMI iERROR84
CMP.W #4,D2
BPL iERROR84
LSL.W #6,D2
ADD.W D2,(A1)
TST.W (A0)+
BEQ .XX
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #2,D0
BNE iERROR19
AND.L #7,D3
OR.W D3,(A1)
.XX:RTS
;*-*
;; Move16 55
ASM_MOVE16:
BSR ASM_GETEA
CMP.W #8,D0
BEQ .ABS
CMP.W #3,D0
BEQ .INC
CMP.W #2,D0
BNE iERROR19
AND.L #7,d3
OR.W D3,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #8,D0
BNE iERROR19
RTS
.ABS:
SUB.W #8,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #3,D0
BEQ .SKIP
ADD.W #16,(A1)
.SKIP:
AND.L #7,D3
OR.W D3,(A1)
RTS
.INC:
SUB.W #$10,(A1)
AND.L #7,D3
OR.W D3,(A1)
BSR ASM_COMMA
BSR ASM_GETEA
CMP.W #8,D0
BNE .REL2
RTS
.REL2:
cmp.w #3,d0
bne iERROR19
add.w #$20,(A1)
lsl.w #8,d3
lsl.w #4,d3
move.w d3,(a4)+
rts
;*-*
;; Pulse 56
ASM_PULSE:
CMP.L #$0F000001,(A3)+
BNE iERROR30
MOVE.L (A3)+,D2
CHKW D2,D0,iERROR31
MOVE.W D2,(A4)+
RTS
;*-*
;; Move 57
ASM_MOVE:
CMP.W #47,(A3)
BEQ .KW1
BSR ASM_GETEA
MOVE.L #%111111111111,d2
btst d0,d2
beq iERROR19 ;should never happen.
cmp.w #1,d0
bne .1
cmp.w #1,d1
beq iERROR31
.1:
or.w d3,(a1)
bsr ASM_COMMA
cmp.w #47,(a3)
beq .KW2
bsr ASM_GETEA
move.l #%000111111111,d2
btst d0,d2
beq iERROR19
cmp.w #1,d0
bne .2
cmp.w #1,d1
beq iERROR31
and.l #7,d3
lsl.w #8,d3
lsl.w #1,d3
or.w d3,(a1)
or.w #64,(a1)
rts
.2:
move.w d3,d0
lsr.w #3,d3
and.w #%111,d0
lsl.w #3,d0
add.w d3,d0
lsl.w #6,d0
or.w d0,(a1)
rts
.KW1:
cmp.w #2,d1
bne iERROR31
addq.l #2,a3
move.w (a3)+,d0
cmp.w #$27,d0
bne .KW1_2
move.w #$42c0,(A1)
bra .KW1_EXIT
.KW1_2:
cmp.w #$28,d0
bne iERROR19
move.w #$40c0,(a1)
.KW1_EXIT:
bsr ASM_COMMA
BSR ASM_GETEA
move.l #%000111111101,d2
btst d0,d2
beq iERROR19
or.w d3,(A1)
rts
.KW2:
cmp.w #1,d0
beq iERROR19 ; move A0,xxx
addq.l #2,a3
move.w (a3)+,d0
cmp.w #$27,d0
bne .KW2_2
move.w (a1),d0
and.w #%111111,d0
move.w #$44c0,(a1)
or.w d0,(a1)
rts
.KW2_2:
cmp.w #$28,d0
bne iERROR19
move.w (a1),d0
and.w #%111111,d0
move.w #$46c0,(a1)
or.w d0,(a1)
rts
;*-*
;; Andi 58
ASM_ANDI:
BSR ASM_GETEA
CMP.W #11,d0
bne iERROR30
bsr ASM_COMMA
cmp.w #47,(a3)
beq .KW
bsr ASM_GETEA
move.l #%000111111101,d2
btst d0,d2
beq iERROR19
or.w d3,(a1)
rts
.KW:
cmp.w #1,d1
bne iERROR31
addq.l #2,a3
cmp.w #$27,(a3)+
bne iERROR19
move.w #$23c,(a1)
rts
;*-*
;; Eori 59
ASM_EORI:
BSR ASM_GETEA
CMP.W #11,d0
bne iERROR30
bsr ASM_COMMA
cmp.w #47,(a3)
beq .KW
bsr ASM_GETEA
move.l #%000111111101,d2
btst d0,d2
beq iERROR19
or.w d3,(a1)
rts
.KW:
cmp.w #1,d1
bne iERROR31
addq.l #2,a3
cmp.w #$27,(a3)+
bne iERROR19
move.w #$A3c,(a1)
rts
;*-*
;; Ori 60
ASM_ORI:
BSR ASM_GETEA
CMP.W #11,d0
bne iERROR30
bsr ASM_COMMA
cmp.w #47,(a3)
beq .KW
bsr ASM_GETEA
move.l #%000111111101,d2
btst d0,d2
beq iERROR19
or.w d3,(a1)
rts
.KW:
cmp.w #1,d1
bne iERROR31
addq.l #2,a3
cmp.w #$27,(a3)+
bne iERROR19
move.w #$3c,(a1)
rts
;*-*
;; FPU reg
ASM_GETFPREG:
CMP.W #47,(A3)+
BNE iERROR80
MOVE.W (A3)+,D2
SUB.W #$1c,D2
BMI iERROR80
CMP.W #$8,D2
BPL iERROR80
RTS
;*-*
;; Data reg
ASM_GETDATAREG: ; D0=SHIFT
BSR ASM_REGID
CMP.B #4,(A3)+
BNE iERROR19
MOVE.B (A3)+,D2
AND.W #%111,D2
LSL.W D0,D2
ADD.W D2,(A1)
BSR SKIP244
RTS
;*-*
;; Any EA
ASM_ANYEA: ; D7=SHIFT, res=d3.ea after shift
BSR.W ASM_GETEA
LSL.W D7,D3
ADD.W D3,(A1)
RTS
;*-*
;; Get EA
ASM_GETEA:
MOVE.W (A3)+,D0
CMP.W #$400,D0 ; COMPLEX OR BASIC ADR.MODE
BMI .2
;; Dx/Ax/(Ax)/(PC)/(A0)+/-(A0)
SUB.W #$400,D0 ; LOWBYTE IS ADR.MASK, HI IS #ADR.MODE
MOVEQ #0,D3
MOVE.B D0,D3 ; D3.L = ADR.MODE MASK
LSR.W #8,D0 ; D0.W = # ADR.MODE
CMP.W #11,D0
BEQ.S .1
CMP.W #5,D0
BPL iERROR19
CMP.W #1,D0
BEQ.S .AX
.X: RTS ; DELIVERS MASK IN D3 AND # IN D0
.AX: CMP.W #1,D1
BEQ iERROR19
RTS
;*-*
;; Immediate
.1: MOVEM.L D1/A0,-(A7)
CMP.W #LIBC,(A3)
BNE .1_1
ADDQ.L #4,A3
MOVE.W (A3)+,D1
EXT.L D1
ADDQ.L #8,A3
MOVEQ #0,D0
BRa .1_2
.1_1:
BSR ASM_GRABVALUE
.1_2:
MOVE.L D1,D4
MOVEM.L (A7)+,D1/A0
CMP.W #-1,D0 ; IMMEDIATE VALUE?
BEQ iERROR19
MOVE.W #%111100,D3
MOVEQ #11,D0
CMP.W #3,D1
BNE.S .4
MOVE.L D4,(A4)+ ; .L #
RTS
.4: CMP.W #2,D1
BNE.S .5
CHKW D4,D5,iERROR93
MOVE.W D4,(A4)+ ; .W #
RTS
.5: CHKB D4,D5,iERROR94
MOVE.B #0,(A4)+ ; .B #
MOVE.B D4,(A4)+
RTS
;*-*
.2:
CMP.W #29,(A3)
BEQ _020
CMP.W #17,D0
BEQ _BRACKET
;; Other
SUBQ.L #2,A3 ; ANY OTHER MODE
MOVEM.L D1/A0,-(A7)
BSR ASM_GRABVALUE
MOVE.L D1,D4 ; D4=VALUE
CMP.W #-1,D0
BEQ ASM_GETLABEL
MOVEM.L (A7)+,D1/A0
GL_BACK:
MOVE.B (A3),D2 ; SEE WHAT'S NEXT
CMP.B #4,D2
BMI .6 ; ABS OR INDEXED MODE
CMP.W #$D,d2
beq .xxPC
CMP.B #6,D2 ;
BNE iERROR19
MOVE.W (A3)+,D3
AND.W #%111,D3
OR.W #%101000,D3
MOVEQ #5,D0
MOVE.W D4,(A4)+
CHKW D4,D5,iERROR93
RTS
;; $00(PC)
.xxPC:
addq.l #2,a3
moveq #0,d3
move.w #%111010,d3
moveq #9,d0
move.w d4,(a4)+
CHKW D4,D5,iERROR31
RTS
;*-*
;; $00(PC,Rn)
.xxPCxx:
addq.l #2,a3
BSR ASM_COMMA
cmp.b #4,(a3)
blt iERROR17
cmp.b #5,(a3)
bgt iERROR17
seq d0
move.w (a3)+,d3
and.w #7,d3
and.b #8,d0
or.b d0,d3
lsl.w #4,d3
move.b d3,(a4)+
move.b d4,(a4)+
MOVE.L D4,D5 ; D5=EXTENSIONWORD
CHKB D5,D4,iERROR31
moveq #0,d3
move.w #%111011,d3
moveq #10,d0
CHKW D4,D5,iERROR31
cmp.w #18,(a3)+
bne iERROR74
RTS
;*-*
.6: MOVE.W (A3),D2
CMP.W #17,D2
BEQ.S .9
CMP.W #26,D2
BEQ.S .7
CMP.W #27,D2
BNE.S .8
ADDQ.L #2,A3
.8: MOVE.W #%111001,D3 ; ABS 4
MOVEQ #8,D0
MOVE.L D4,(A4)+
RTS
.7: ADDQ.L #2,A3 ; ABS 4.W
MOVE.W #%111000,D3
MOVEQ #7,D0
MOVE.W D4,(A4)+
CHKW D4,D5,iERROR93
RTS
.9: ADDQ.L #2,A3 ; off(Ax,Rx.s), D4=off
CMP.B #$E,(A3)
BEQ .xxPCxx
CMP.B #5,(A3)+
BNE iERROR19
MOVE.B (A3)+,D3 ; D3.B = Ax
AND.L #%111,D3 ; (Ax,...
OR.W #%110000,D3
MOVEQ #6,D0
MOVE.L D4,D5 ; D5=EXTENSIONWORD
CHKB D5,D4,iERROR94
AND.W #$FF,D5
CMP.W #COM,(A3)+
BNE iERROR5
BSR ASM_REGID
MOVE.B (A3)+,D2
CMP.B #4,D2 ; ...,Dx
BEQ.S .12
CMP.B #5,D2
BNE iERROR19
BSET #15,D5 ; ...,Ax
.12:
MOVE.B (A3)+,D2
BSR SKIP244
AND.W #%111,D2
MOVEQ #12,D4
LSL.W D4,D2
OR.W D2,D5
MOVE.W (A3)+,D2
CMP.W #26,D2
BEQ .12_2
CMP.W #27,D2
BNE .13
BSET #11,D5
.12_2:
MOVE.W (A3)+,D2
.13:
CMp.W #9,D2
BNE .14
CMP.W #VALUE,(A3)+
BNE iERROR73
MOVE.L (A3)+,D2
MOVEQ #0,D0
CMP.W #1,D2
BEQ .16
ADDQ.L #1,D0
CMP.W #2,D2
BEQ .16
ADDQ.L #1,D0
CMP.W #4,D2
BEQ .16
ADDQ.L #1,D0
CMP.W #8,D2
BNE iERROR91
.16:
LSL.W #8,D0
LSL.W #1,D0
OR.W D0,D5
MOVE.W (A3)+,D2
.14:
CMP.W #18,D2
BNE iERROR74
MOVE.W D5,(A4)+
RTS
;*-*
;; 020 full
_020:
CMP.W #1,ECPU
BMI iERROR53
MOVE.L A0,-(A7)
MOVE.L A4,A0
ADDQ.L #2,A0
MOVE.W #$30,d3 ; adressing mode for suppressed reg
MOVE.W #6,d0
MOVEQ #0,D6
MOVE.l #%0000000111010000,D2 ; here we set a MOVE.L (),...
ADDQ.L #6,A3 ; skip "[xx"
CMP.W #30,(A3)
BNE .020_0
ADDQ.L #2,A3
BSR ASM_COMMA
BSET #1,D6
BRA .020_2
.020_0:
CMP.W #IDENT,(A3)
BEQ .020_ID
MOVEM.L D0/D2-D4/D6-A2/A4-a6,-(A7)
BSR ASM_GRABVALUE
MOVE.L D0,D5
MOVEM.L (A7)+,D0/D2-D4/D6-A2/A4-A6
TST.L D5
BMI .020_1
CMP.W #26,(A3)
BMI .020_0_2
CMP.W #28,(A3)
BPL .020_0_2
CMP.W #27,(A3)+
BEQ .020_0_2
MOVE.W D1,(A0)+
or.w #32,d2
BCLR #4,D2
BRA .020_0_1
.020_0_2:
MOVE.L D1,(A0)+
OR.W #48,D2 ; MOVE.L ([$xxxxxxxx.L
.020_0_1:
CMP.W #COM,(A3)+
BEQ .020_1
CMP.W #30,-2(A3)
bne iERROR0
cmp.w #18,(a3)
beq .020_EXIT
BSR ASM_COMMA ; MOVE.L ([$xxxxxxxx.L],
BSET #0,D6
BRA .020_1
.020_ID:
ADDQ.L #2,A3
MOVE.L (A3)+,D1
CMP.W #$E00,2(a3)
beq .020_ID_PCREL
cmp.w #$E00,4(a3)
beq .020_ID_PCREL
MOVEM.L D0-D7/A1/A2/A4-A6,-(A7)
MOVE.L D1,A1
CMP.B #LAB,4(A1)
BNE iERROR4
MOVE.L A0,A4
MOVE.W 10(A1),D0
BSR ADDBRANCHRELOC
MOVE.L A4,A0
MOVEM.L (A7)+,D0-D7/A1/A2/A4-a6
OR.W #48,D2
BRA .020_0_1
.020_ID_PCREL:
CMP.W #26,(A3)
BMI .020_ID_NOADJ
CMP.W #28,(A3)
BPL .020_ID_NOADJ
CMP.W #27,(A3)+
BPL .020_ID_NOADJ
BCLR #4,D2
OR.W #32,D2
CLR.W NEWOP
MOVEm.L D0-D7/A1/a2/A4-a6,-(A7)
move.l a0,a4
MOVE.L D1,A1
MOve.w 10(a1),d0
BSR ADDBRANCHPCREL16E
move.l a4,a0
movem.l (a7)+,d0-d7/a1/a2/a4-a6
BRA .020_0_1
.020_ID_NOADJ:
MOVEm.L D0-D7/A1/a2/A4-a6,-(A7)
move.l a0,a4
MOVE.L D1,A1
MOve.w 10(a1),d0
BSR ADDBRANCHPCREL32E
move.l a4,a0
movem.l (a7)+,d0-d7/a1/a2/a4-a6
OR.W #48,D2
BRA .020_0_1
.020_1:
CMP.w #$E00,(A3)
beq .020_1_1
CMP.B #5,(A3)
BNE .020_2
CMP.W #9,2(A3)
BEQ .020_2
CMP.W #26,2(A3)
BEQ .020_2
CMP.W #27,2(a3)
beq .020_2
BTST #0,D6
bne .020_2 ; MOVE.L ([$xxxxxxxx.L]
MOVE.W (A3)+,D1 ; MOVE.L ([$xxxxxxxx.L,Ax
BCLR #7,D2
and.l #7,d1
add.w d1,d3
bra .020_1_2
.020_1_1:
addq.l #2,a3
addq.l #8,d3
addq.l #3,d3
moveq #10,d0
bclr #7,d2
.020_1_2:
cmp.w #COM,(A3)+
beq .020_2
cmp.w #30,-2(a3)
bne iERROR0
cmp.w #18,(a3)
beq .020_EXIT
bset #1,d6
bsr ASM_COMMA
.020_2:
CMP.B #4,(A3)
BMI .020_3
CMP.B #6,(A3)
BPL .020_3
BTST #1,D6
BEQ .020_2_1
BSET #2,D2
.020_2_1:
bclr #6,d2 ; MOVE.L ([$xxxxxxxx.L, Ax, Rn
MOVE.W (A3)+,D1 ; or
btst #8,d1 ; MOVE.L ([$xxxxxxxx.L, Ax], Rn
beq .020_2_2
bset #15,d2
.020_2_2:
and.l #7,d1
rol.w #8,d1
rol.w #4,d1
or.w d1,d2
cmp.w #26,(A3)
bmi .020_2_3
cmp.w #28,(a3)
bpl .020_2_3
cmp.w #27,(a3)+
bne .020_2_3
bset #11,d2
.020_2_3:
cmp.w #9,(a3)
bne .020_2_5
addq.l #2,a3
cmp.w #VALUE,(a3)+
bne iERROR73
move.l (A3)+,d1
moveq #0,d0
cmp.l #1,d1
beq .020_2_4
addq.l #1,d0
cmp.l #2,d1
beq .020_2_4
addq.l #1,d0
cmp.l #4,d1
beq .020_2_4
addq.l #1,d0
cmp.l #8,d1
bne iERROR91
.020_2_4:
rol.w #8,d0 ; MOVE.L ([$xxxxxxxx.L, Ax, Rn.s*y], $yyyyyyyy)
rol.w #1,d0
or.w d0,d2
.020_2_5:
btst #1,d6
bne .020_2_7
cmp.w #30,(a3)+
bne iERROR34
.020_2_7:
cmp.w #18,(a3)
beq .020_EXIT
BSR ASM_COMMA
.020_3:
MOVEM.L D0/D2-D4/D6-A2/A4-a6,-(A7)
BSR ASM_GRABVALUE
MOVE.L D0,D5
MOVEM.L (A7)+,D0/D2-D4/D6-A2/A4-A6
TST.L D5
BMI .020_EXIT
CMP.W #26,(A3)
BMI .020_3_1
CMP.W #28,(A3)
BPL .020_3_1
cmp.w #26,(A3)+
BNE .020_3_1
move.w d1,(a0)+
or.w #2,d2
bra .020_3_2
.020_3_1:
move.l d1,(a0)+
or.w #3,d2
.020_3_2:
.020_EXIT
CMP.W #18,(A3)+
BNE iERROR0
MOVE.W D2,(A4)
MOVE.L A0,A4
MOVE.L (A7)+,A0
RTS
;*-*
;; bracketed
;; value
_BRACKET:
MOVEQ #0,D4
MOVE.W (A3),D2
CMP.W #IDENT,D2
BEQ .BR_IDENT
CMP.W #LIBC,D2
; BEQ .BR_LIBC
CMP.W #VALUE,D2 ; ($xx,Ax/PC,Rn.S*F)
BNE .BR_0
ADDQ.L #2,A3
MOVE.L (A3)+,D4
swap d4
tst.w d4
bne iERROR93
swap d4
BSR ASM_COMMA
.BR_0:
CMP.B #$E,(A3)
BEQ .BR_1
CMP.B #$5,(A3)
BNE iERROR92
MOVE.W (A3)+,D2
AND.L #7,D2
moveq #$28,d3
or.w d2,d3
moveq #5,d0
BRA .BR_2
.BR_1:
move.w (a3)+,d2
moveq #$3a,d3
moveq #9,d0
.BR_2:
CMP.W #COM,(A3)
BNE .BR_EXIT
BSR ASM_COMMA
CMP.B #5,(a3)
seq D5
moveq #8,d2
and.l d2,d5
move.w (a3)+,d2
and.l #7,d2
or.w d5,d2
ror.w #4,d2
ror.l #8,d4
tst.b D4
bne iERROR94
rol.l #8,d4
or.w d2,d4
cmp.w #$3B,D3
BEQ .BR_3
ADDQ.L #7,d3
.BR_3:
ADDQ.L #1,D3
addq.l #1,d0
CMP.W #18,D2
BEQ .BR_EXIT
move.w (a3),d2
cmp.w #27,D2
bgt .BR_4
cmp.w #26,d2
blt .BR_4
move.w (a3)+,d2
cmp.w #26,d2
beq .BR_4
bset #11,d4
.BR_4:
cmp.w #18,(A3)
beq .BR_EXIT
move.w (a3)+,d2
cmp.w #9,d2
bne iERROR0
cmp.w #VALUE,(a3)+
bne iERROR73
move.l (a3)+,d2
moveq #0,d5
CMP.W #1,D2
BEQ .BR_5
ADDQ.L #1,D5
CMP.W #2,D2
BEQ .BR_5
ADDQ.L #1,D5
CMP.W #4,D2
BEQ .BR_5
ADDQ.L #1,D5
CMP.W #8,D2
BNE iERROR91
.BR_5:
LSL.W #8,D5
LSL.W #1,D5
OR.W D5,D4
.BR_EXIT:
cmp.w #18,(a3)+
bne iERROR74
move.w d4,(a4)+
rts
;*-*
;; ident
.BR_IDENT:
addq.l #2,a3
MOVE.L (A3)+,A5
tst.b 4(a5)
beq iERROR22
cmp.b #3,4(a5)
beq .BRI_LABEL
moveq #$28+5,d3
moveq #5,d0
moveq #0,d4
move.w 10(a5),d4
cmp.b #2,4(a5)
bne .BRI_1
subq.w #1,d3
.BRI_1:
cmp.w #COM,(a3)
bne .BR_EXIT
ADDQ.L #1,D0
addq.l #8,d3
ror.w #8,d4
tst.b d4
beq .BRI_0
cmp.b #$ff,d4
bne iERROR94
.BRI_0:
clr.b d4
rol.w #8,d4
bsr ASM_COMMA
cmp.b #5,(a3)
seq D2
bgt iERROR95
cmp.b #4,(a3)
blt iERROR95
and.l #8,d2
ror.w #4,d2
or.w d2,d4
move.w (a3)+,d2
and.l #7,d2
ror.w #4,d2
or.w d2,d4
cmp.w #18,(a3)
beq .BR_EXIT
cmp.w #9,(a3)
beq .BRI_2
cmp.w #26,(a3)
blt iERROR0
cmp.w #27,(a3)
bgt iERROR0
seq D2
rol.l #8,d2
and.l #$800,d2
or.w d2,d4
addq.l #2,a3
.BRI_2:
cmp.w #18,(a3)
beq .BR_EXIT
cmp.w #9,(a3)+
bne iERROR9
cmp.w #VALUE,(a3)+
bne iERROR73
move.l (a3)+,d2
moveq #0,d5
cmp.w #1,d2
beq .BRI_3
addq.l #1,d5
cmp.w #2,d2
beq .BRI_3
addq.l #1,d5
cmp.w #4,d2
beq .BRI_3
addq.l #1,d5
cmp.w #8,d2
bne iERROR91
.BRI_3:
lsl.l #8,d5
lsl.l #1,d5
or.w d5,d4
bra .BR_EXIT
;*-*
;; label
.BRI_LABEL:
BSR ASM_COMMA
CMP.W #$E00,(A3)+
BNE iERROR92
moveq #$3a,d3
moveq #9,d0
moveq #0,d4
cmp.w #COM,(a3)
bne .BRL_EXIT
ADDQ.L #1,D0
addq.l #1,d3
bsr ASM_COMMA
cmp.b #5,(a3)
seq D2
bgt iERROR95
cmp.b #4,(a3)
blt iERROR95
and.l #8,d2
ror.w #4,d2
or.w d2,d4
move.w (a3)+,d2
and.l #7,d2
ror.w #4,d2
or.w d2,d4
cmp.w #18,(a3)
beq .BRL_EXIT
cmp.w #9,(a3)
beq .BRL_2
cmp.w #26,(a3)
blt iERROR0
cmp.w #27,(a3)
bgt iERROR0
seq D2
rol.l #8,d2
and.l #$800,d2
or.w d2,d4
addq.l #2,a3
.BRL_2:
cmp.w #18,(a3)
beq .BRL_EXIT
cmp.w #9,(a3)+
bne iERROR9
cmp.w #VALUE,(a3)+
bne iERROR73
move.l (a3)+,d2
moveq #0,d5
cmp.w #1,d2
beq .BRL_3
addq.l #1,d5
cmp.w #2,d2
beq .BRL_3
addq.l #1,d5
cmp.w #4,d2
beq .BRL_3
addq.l #1,d5
cmp.w #8,d2
bne iERROR91
.BRL_3:
lsl.l #8,d5
lsl.l #1,d5
or.w d5,d4
.BRL_EXIT:
cmp.w #18,(a3)+
bne iERROR74
move.w d4,(a4)+
cmp.w #10,d0
beq .BRL_EXIT2
.BRL_FINE:
movem.l d0/A0,-(a7)
move.w 10(a5),d0
clr.w NEWOP
bsr ADDBRANCH
movem.l (a7)+,d0/a0
rts
.BRL_EXIT2:
move.b #1,-1(a4)
bra .BRL_FINE
;*-*
;*-*
;*-*
;; GetLabel
ASM_GETLABEL: ; E INTERFACE TO ASM_GETEA ADR.MODE
MOVEM.L (A7)+,D1/A0
MOVE.W (A3)+,D0
CMP.W #IDENT,D0
BNE .4
MOVE.L (A3)+,A5 ; A5=VAR
MOVE.B 4(A5),D2
BEQ iERROR22
CMP.B #LAB,D2
BEQ .3
BTST #3,5(A5) ; SEE IF REGVAR
BNE.W .REG
CMP.B #GLOBV,D2
BNE.S .1
MOVEQ #%101100,D3
BRA.S .2
.1: MOVEQ #%101101,D3
.2: MOVE.W 10(A5),D0
MOVE.W (A3),D2
CMP.W #29,D2
BPL.S .5
CMP.W #26,D2
BMI.S .5
ADDQ.L #2,A3
CMP.W #27,D2
BEQ.S .5
CMP.W #26,D2
BNE.S .6
ADDQ.W #2,D0
OPINT
BRA.S .5
.6: ADDQ.W #3,D0
OPCHAR
.5: CMP.B #GLOBV,4(A5)
BNE.S .8
GENGI A5,D2
.8: OPLONG
MOVE.W D0,(A4)+
MOVEQ #5,D0
RTS
.REG: MOVEQ #0,D0
MOVE.W 10(A5),D3
RTS
.3: BTST #4,5(A5) ; CHECK IF METHOD
BNE iERROR4
CMP.W #$D00,(A3)+
BNE .9
MOVE.W 10(A5),D0 ; LAB(PC)
CLR.W (A4)+
MOVEM.L D1/A0,-(A7)
CLR.W NEWOP
BSR ADDBRANCH
MOVEM.L (A7)+,D1/A0
MOVEQ #9,D0
MOVEQ #%111010,D3
RTS
.9: SUBQ.L #2,A3 ; lab(PC,Rx.s)
CMP.W #17,(A3)+
BNE iERROR19
CMP.W #$E00,(A3)+
BNE iERROR19
MOVEQ #%111011,D3 ; (PC,...
MOVEQ #10,D0
MOVEQ #0,D4
MOVE.L D4,D5 ; D5=EXTENSIONWORD
MOVEM.L D0-D1/A0,-(A7)
MOVE.W 10(A5),D0
MOVE.W #1,(A4)+
CLR.W NEWOP
BSR ADDBRANCH
MOVEM.L (A7)+,D0-D1/A0
MOVE.W -(A4),D5
CMP.W #COM,(A3)+
BNE iERROR5
BSR ASM_REGID
MOVE.B (A3)+,D2
CMP.B #4,D2 ; ...,Dx
BEQ.S .12
CMP.B #5,D2
BNE iERROR19
BSET #15,D5 ; ...,Ax
.12: MOVE.B (A3)+,D2
BSR SKIP244
AND.W #%111,D2
MOVEQ #12,D4
LSL.W D4,D2
ADD.W D2,D5
.13: MOVE.W (A3)+,D2
CMP.W #26,D2
BEQ.S .13
CMP.W #18,D2
BEQ .14
CMP.W #27,D2
BNE iERROR0
BSET #11,D5
BRA.S .13
.14: MOVE.W D5,(A4)+
RTS
.4: CMP.W #LIBC,D0 ; LIBCALL(Ax)
BNE iERROR19
ADDQ.L #2,A3
MOVEQ #0,D4
MOVE.W (A3)+,D4
ADDQ.L #8,A3
EXT.L D4
BRA GL_BACK
CMP.B #6,(A3)+
BNE iERROR19
MOVE.B (A3)+,D3
AND.W #%111,D3
ADD.W #%101000,D3
MOVEQ #5,D0
RTS
;*-*
;; GrabValue
; EATS INTERIM CODE FOR TRUE VALUES + CALC
; -->D0=TRUE/FALSE WAS VALUE
; -->D1=RESULT
; TRASHES: D0-D4,A0
ASM_GRABVALUE:
MOVEQ #0,D1
MOVEQ #-1,D0 ; IF D0=-1 THEN NOVALUE ELSE CODENR
.XL:
MOVEQ #0,D2 ; D2<>0 --> NEGATE
MOVE.W (A3)+,D3
CMP.W #55,D3
BEQ .XL
CMP.W #8,D3 ; '-' SIGN ?
BNE.S .1
MOVEQ #-1,D2
.xl
MOVE.W (A3)+,D3
CMP.W #55,D3
BEQ .xl
CMP.W #VALUE,D3
BNE.S .X2
BRA.S .2
.1: CMP.W #VALUE,D3 ; VALUE ?
BNE.S .X ; sizeof or exit
.2: CMP.W #-1,D0 ; SIZEOFBACK
BNE.S .3
MOVEQ #6,D0 ; ATLEAST ONE VALUE
.3: TST.L D2
BEQ.S .4
NEG.L (A3)
.4: SUBQ.W #6,D0
LSL.W #2,D0
MOVE.L .T(PC,D0.W),A0
JMP (A0)
.T: DC.L .MOVE, .ADD, .SUB, .MUL, .DIV
DC.L .AND, .OR, .LSL, .LSR
.XB:
MOVE.W (A3)+,D0
CMP.W #11,D0
BPL.S .X3
CMP.W #7,D0
BMI.S .X3 ; SEE IF AND/OR, ELSE QUIT
.AOB:
BRA.S .XL
.X2:
SUBQ.L #4,A3
CMP.W #-1,D0
BEQ.S .5
SUBQ.L #2,A3
RTS
.X: CMp.W #LIBC,D3
BEQ .LIB
CMP.W #IOFF+50,D3 ; check for sizeof
BNE.S .XNS
CMP.W #31,(A3)+ ; OBJECT
BNE iERROR40
MOVE.L (A3)+,A0 ; WE USE A0=OBJ
MOVE.W 4(A0),-(A3)
BEQ iERROR40 ; NO SIZEOF IN CONST DECL. (SOB..)
CLR.W -(A3)
BRA.S .2
.LIB:
ADDQ.L #2,A3
MOVE.L D3,-(A7)
MOVE.W (A3)+,D3
ADDQ.L #4,A3
EXT.L d3
MOVE.L D3,(A3)
MOVE.L (A7)+,D3
BRA .2
.XNS:
SUBQ.L #2,A3 ; ASSUMES NEXT WORD ALREADY READ
CMP.W #-1,D0
BEQ.S .5
SUBQ.L #2,A3
.5: RTS
.X3:
CMP.W #IOFF+29,D0 ; CHECK FOR AND/OR
BEQ.S .AO
CMP.W #IOFF+30,D0
BEQ.S .AO
CMP.W #49,D0
BEQ.S .LSD ; LOGICAL SHIFT [direction], not LSD ;)
CMP.W #50,D0
BEQ.S .LSD
SUBQ.L #2,A3
RTS
.AO:
SUB.W #IOFF+18,D0
BRA.S .AOB
.LSD:
SUB.W #36,D0
BRA.S .AOB
.MOVE:
MOVE.L (A3)+,D1
BRA .XB
.ADD:
ADD.L (A3)+,D1
BRA .XB
.SUB:
SUB.L (A3)+,D1
BRA .XB
.AND:
AND.L (A3)+,D1
BRA .XB
.OR:
OR.L (A3)+,D1
BRA .XB
.LSL:
MOVE.L (A3)+,D4
LSL.L D4,D1
BRA .XB
.LSR:
MOVe.L (A3)+,D4
LSR.L D4,D1
BRA .XB
.MUL: MOVE.L (A3)+,D4
MOVE.L D4,D2
MOVE.L D4,D3
MULU D1,D4
SWAP D3
MULU D1,D3
SWAP D3
CLR.W D3
ADD.L D3,D4
SWAP D1
MULU D1,D2
SWAP D2
CLR.W D2
ADD.L D2,D4
MOVE.L D4,D1
BRA .XB
;.DIV: MOVE.L (A3)+,D4
; MOVEQ #32,D3
; MOVEQ #0,D2
;.D1: SUB.L D4,D2
; BCC.B .D2
; ADD.L D4,D2
;.D2: ROXL.L #1,D1
; ROXL.L #1,D2
; DBF D3,.D1
; NOT.L D1
; BRA .XB
.DIV: MOVE.L D1,-(A7)
MOVE.L (A3)+,-(A7)
TST.L (A7)
BEQ iERROR15
JSR I_DIV
ADDQ.L #8,A7
MOVE.L D0,D1
BRA .XB
;*-*
;*-*
;; PPC ASM
PASM_COMPILE:
MOVEM.L A2/A5,-(A7)
MOVE.W #31,PASM_RC_BIT
CLR.W PASM_RC_FLG
MOVE.L (A3)+,D7
MOVE.W (A3)+,PASM_RC_FLG
LSL.L #2,D7
LEA PPC_INSJOB,A0
MOVE.L 0(A0,D7),A5
.DO:MOVEQ #0,D7
MOVE.W (A5)+,D7
BEQ .X
SUBQ.L #1,D7
LSL.W #2,D7
LEA .JOB(PC),A2
MOVE.L (A2,D7),A2
JSR (A2)
BRA .DO
.X: MOVEM.L (A7)+,A2/A5
RTS
.JOB:
DC.L PASM_CODE,ASM_COMMA,PASM_ASKGPR,PASM_SETRC,PASM_DORC
DC.L PASM_GETSIMM,PASM_DISRC,PASM_GPRORZERO,PASM_REQUESTRC
DC.L PASM_NOTIMPL,PASM_GET5BIT,PASM_GETCRF,PASM_GETBIT
DC.L PASM_GETDBL5,PASM_GETFPR,PASM_GETCRFD,PASM_RELATIVE
DC.L PASM_GETSPR,PASM_GET4BIT,PASM_GETTB,PASM_GETXBIT
DC.L PASM_DBLGPR,PASM_SPLIT6BIT,PASM_LABEL,PASM_ABSOLUTE
PASM_RC_BIT:
DC.W 31
PASM_RC_FLG:
DC.W 0
;; Code
PASM_CODE:
MOVEQ #0,D7
MOVE.W (A5)+,D7
SUBQ.L #1,D7
CLR.L (A4)
.1: MOVEQ #0,D0
MOVE.W (A5)+,D0
MOVE.L #31,D1
SUB.W (A5)+,D1
LSL.L D1,D0
OR.L D0,(A4)
DBF D7,.1
ADDQ.L #4,A4
RTS
;*-*
;; Ask for GeneralPurposeRegister
PASM_ASKGPR:
CMP.W #47,(A3)+
BNE iERROR100
MOVEQ #0,D0
MOVE.W (A3)+,D0
MOVEQ #$3B,D1
SUB.L D1,D0
BMI iERROR100
CMP.W #$20,D0
BPL iERROR100
moveq #31,d1
sub.w (a5)+,d1
lsl.l d1,d0
or.l d0,-4(a4)
rts
;*-*
;; Set RC
PASM_SETRC:
MOVE.W (A5)+,PASM_RC_BIT
RTS
;*-*
;; Do RC
PASM_DORC:
MOVE.W PASM_RC_FLG(PC),D0
AND.L #1,D0
MOVEQ #31,D1
SUB.W PASM_RC_BIT(PC),D1
LSL.L D1,D0
OR.L D0,-4(A4)
RTS
;*-*
;; Get Signed Immediate
PASM_GETSIMM:
CMP.W #$F00,(A3)+
BNE iERROR30
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR30
MOVE.L D1,D0
CHKW D0,D1,iERROR93
MOVEQ #31,D7
SUB.W (A5)+,D7
LSL.L D7,D0
OR.L D0,-4(A4)
RTS
;*-*
;; illegal RC
PASM_DISRC:
TST.W PASM_RC_FLG
BNE iERROR101
RTS
;*-*
;; Get GPR or zero
PASM_GPRORZERO:
CMP.W #VALUE,(A3)
BEQ .1
CMP.W #47,(A3)+
BNE iERROR100
MOVEQ #0,D0
MOVE.W (A3)+,D0
SUB.L #$3b,D0
BMI iERROR100
CMP.L #$20,D0
BPL iERROR100
.0:
MOVEQ #31,D1
SUB.W (A5)+,D1
LSL.L D1,D0
OR.L D0,-4(A4)
RTS
.1: ADDQ.L #2,A3
MOVEQ #0,D0
TST.L (A3)+
BNE iERROR100
BRA .0
;*-*
;; Request RC
PASM_REQUESTRC:
TST.W PASM_RC_FLG
BEQ iERROR101
RTS
;*-*
;; Not implemented
PASM_NOTIMPL:
BRA iERROR87
;*-*
;; Get 5 bit immediate value
PASM_GET5BIT:
CMP.W #$F00,(A3)+
BNE iERROR30
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR30
CMP.L #$20,D1
BPL iERROR31
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D1
OR.L D1,-4(A4)
RTs
;*-*
;; Get CRx
PASM_GETCRF:
CMP.W #47,(A3)
BEQ .2
CMP.W #$F00,(A3)+
BNE iERROR102
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR102
CMP.L #8,D1
BPL iERROR102
MOVEq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
.2: CMP.W #91,2(a3)
bpl .3
addq.l #4,a5
rts
.3: addq.l #2,a3
moveq #0,d1
move.w (a3)+,d1
sub.l #91,d1
cmp.l #8,d1
bpl iERROR102
moveq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
;*-*
;; Get Bit
PASM_GETBIT:
cmp.w #$F00,(A3)+
bne iERROR30
bsr ASM_GRABVALUE
tst.l d0
bmi iERROR30
move.l d1,d0
and.l #$FFFFFFFE,d0
tst.l d0
bne iERROR31
moveq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
;*-*
;; Get and double 5 bit immediate
PASM_GETDBL5:
CMP.W #$F00,(A3)+
BNE iERROR30
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR30
CMP.L #$20,D1
BPL iERROR31
MOVE.L D1,D2
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D1
OR.L D1,-4(A4)
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D2
OR.L D2,-4(A4)
RTs
;*-*
;; Get Floating point register
PASM_GETFPR
CMP.W #47,(A3)+
BNE iERROR103
MOVEQ #0,D0
MOVE.W (A3)+,D0
MOVEQ #99,D1
SUB.L D1,D0
BMI iERROR103
CMP.W #$20,D0
BPL iERROR103
moveq #31,d1
sub.w (a5)+,d1
lsl.l d1,d0
or.l d0,-4(a4)
rts
;*-*
;; Get CRFx
PASM_GETCRFD:
CMP.W #47,(A3)
BEQ .2
CMP.W #$F00,(A3)+
BNE iERROR102
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR104
CMP.L #8,D1
BPL iERROR104
MOVEq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
.2: CMP.W #131,2(a3)
bpl .3
addq.l #4,a5
rts
.3: addq.l #2,a3
moveq #0,d1
move.w (a3)+,d1
sub.l #131,d1
cmp.l #8,d1
bpl iERROR104
moveq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
;*-*
;; Get GPR or zero
PASM_RELATIVE:
CMP.W #VALUE,(A3)
BNE .brkt
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR73
MOVE.L D1,D0
SWAP D0
TST.W D0
BNE iERROR93
MOVEQ #31,D0
SUB.W (A5),D0
AND.W 2(A5),D1
LSL.L D0,D1
OR.L D1,-4(A4)
CMP.W #17,(A3)
BNE .XIT
.brkt:
CMP.W #17,(A3)+
BNE iERROR19
CMP.W #47,(A3)+
BNE iERROR100
MOVEQ #0,D0
MOVE.W (A3)+,D0
SUB.L #$3b,D0
BMI iERROR100
CMP.L #$20,D0
BPL iERROR100
MOVEQ #31,D1
SUB.W 4(A5),D1
LSL.L D1,D0
OR.L D0,-4(A4)
CMP.W #18,(A3)+
BNE iERROR74
.XIT:
ADDQ.L #6,A5
RTS
;*-*
;; Get SPR
PASM_GETSPR:
CMP.W #47,(A3)
BEQ .2
CMP.W #$F00,(A3)+
BNE iERROR105
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR105
CMP.L #1024,D1
BPL iERROR105
MOVE.L D1,D2
AND.L #%11111,D2
LSR.L #5,D1
LSL.L #5,D2
OR.L D2,D1
MOVEq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
.2: CMP.W #139,2(a3)
bpl .3
BRA iERROR105
.3: addq.l #2,a3
moveq #0,d1
move.w (a3)+,d1
sub.l #139,d1
cmp.l #32,d1
bpl iERROR105
LEA .TAB(PC),A0
lsl.l #1,d1
move.w (a0,d1),d1
and.l #$3FF,D1
MOVE.L D1,D2
AND.L #%11111,D2
LSR.L #5,D1
LSL.L #5,D2
OR.L D2,D1
moveq #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
or.l d1,-4(a4)
rts
.TAB:
DC.W 001,008,009,018,019,022,025,026,027,272,273,274
DC.W 275,280,282,287,528,529,530,531,532,533,534,535
DC.W 536,537,538,539,540,541,542,543,1013
;*-*
;; Get 4 bit immediate value
PASM_GET4BIT:
CMP.W #$F00,(A3)+
BNE iERROR30
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR30
CMP.L #$10,D1
BPL iERROR31
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D1
OR.L D1,-4(A4)
RTs
;*-*
;; GetTimeBase
PASM_GETTB:
CMP.W #COM,(A3)
BNE .DEFTB
ADDQ.L #2,A3
CMp.W #47,(A3)+
BNE .VAL
MOVEQ #0,D1
MOVE.W (A3)+,D1
SUB.L #172,D1
BMI iERROR106
CMP.W #2,D1
BPL iERROR106
ADD.L #268,D1
.FINE:
MOVE.L D1,D0
LSR.L #5,D1
AND.L #31,d0
LSL.L #5,D0
OR.L D0,D1
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D1
OR.L D1,-4(A4)
RTS
.VAL:
CMP.W #VALUE,-2(A3)
BNE iERROR106
MOVE.L (A3)+,D1
cmp.l #268,d1
bmi iERROR106
cmp.l #270,d1
bpl iERROR106
bra .FINE
.DEFTB:
MOVE.L #268,D1
bra .FINE
;*-*
;; Get x bit immediate value
PASM_GETXBIT:
CMP.W #$F00,(A3)+
BNE iERROR30
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR30
MOVEQ #0,D0
MOVEQ #0,D2
MOVE.W (A5)+,D2
BSET D2,D0
CMP.L D0,D1
BPL iERROR31
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D1
OR.L D1,-4(A4)
RTs
;*-*
;; Get & double the GPR.
PASM_DBLGPR:
CMP.W #47,(A3)+
BNE iERROR100
MOVEQ #0,D0
MOVE.W (A3)+,D0
MOVEQ #$3B,D1
SUB.L D1,D0
BMI iERROR100
CMP.W #$20,D0
BPL iERROR100
move.l d0,d2
moveq #31,d1
sub.w (a5)+,d1
lsl.l d1,d0
or.l d0,-4(a4)
moveq #31,d1
sub.w (a5)+,d1
lsl.l d1,d2
or.l d2,-4(a4)
rts
;*-*
;; Get & split 6 bit immediate value
PASM_SPLIT6BIT:
CMP.W #$F00,(A3)+
BNE iERROR30
BSR ASM_GRABVALUE
TST.L D0
BMI iERROR30
CMP.L #$40,D1
BPL iERROR31
MOVE.L D1,D2
LSR.L #5,D2
MOVEQ #31,D0
SUB.W (A5)+,D0
LSL.L D0,D2
or.l d2,-4(a4)
AND.L #31,D1
MOVEQ #31,d0
sub.w (a5)+,d0
lsl.l d0,d1
OR.L D1,-4(A4)
RTs
;*-*
;; Get label
PASM_LABEL:
CMP.W #IDENT,(A3)+
BNE iERROR4
MOVE.L (A3)+,A1
MOVe.W 10(A1),D0
CLR.W NEWOP
BSR ADDBRANCH
RTS
;*-*
;; Get absolute
PASM_ABSOLUTE:
CMP.W #VALUE,(A3)+
BNE iERROR73
MOVE.L (A3)+,D0
btst #0,d0
bne iERROR0
btst #1,d0
bne iERROR0
cmp.l #$4000000,d0
bpl iERROR31
or.l d0,-4(a4)
rts
;*-*
;; Get label 16bit
PASM_LAB16B:
CMP.W #IDENT,(A3)+
BNE iERROR4
MOVE.L (A3)+,A1
MOVe.W 10(A1),D0
CLR.W NEWOP
BSR ADDBRANCH
RTS
;*-*
;; Get absolute 16bit
PASM_ABS16B:
CMP.W #VALUE,(A3)+
BNE iERROR73
MOVE.L (A3)+,D0
btst #0,d0
bne iERROR0
btst #1,d0
bne iERROR0
cmp.l #$10000,d0
bpl iERROR31
or.l d0,-4(a4)
rts
;*-*
;*-*